czwartek, 19 kwietnia 2012

Migracja z EasyMock’a na Mockito

Dostałem wczoraj w projekcie zadanie zmigrowania testów korzystających z EasyMock’a na Mockito. Zadanie to przypadło mi, ponieważ jakiś czas temu udało mi się wprowadzić do projektu Mockito, co uważam za duży sukces, gdyż jak wiadomo inicjowanie zmian w projektach nie jest łatwe.

Poniżej przedstawiam jak mi poszło.

9:00 Zbudowałem projekt, odpaliłem testy i zapisałem ile ich jest.
9:02 Sprawdziłem, że mam tylko 3 testy wykorzystujące EasyMock’a. W tym momencie stwierdziłem, że nie ma co szukać w Google jakiegoś migratora, ściągać, instalować i zastanawiać się, jak go uruchomić. Przy tak nie wielkiej liczbie klas do zmiany szkoda zachodu i lepiej zrobić to prymitywną metodą Search & Replace.
9:16 Skończyłem migrować 1wszą klasę.
9:19 Po przyjrzeniu się klasie zrobiłem jeszcze refaktoring, bo jak nie teraz to kiedy? Później nigdy nie nadejdzie.
9:20 Zacząłem modyfikować następną klasę.
9:27 Zakończyłem migrację i refaktoring. Wziąłem się za ostatnią klasę.
9:34 Ukończyłem modyfikacje dla 3ciej klasy.
9:35 Uruchomiłem wszystkie testy – działa.
9:41 Usunąłem wpisy dotyczące EasyMock’a w pom’ach Mavenowych. Tutaj przydała się funkcjonalność „Szukaj w plikach”, jaką daje Notepad++, abym mógł wyszukać wszystkie wpisy.
9:42 Odpaliłem builda i testy w Eclipse - zakończone sukcesem.
9:43 Odpaliłem builda i testy za pomocą konsoli – również zakończone sukcesem.
9:44 Rozpocząłem proces synchronizacji z repozytorium.
9:46 Zmiany zacomitowane.
9:52 Wystartował build na serwerze CI.
10:00 Build zakończył się jednym fail’ujacym testem. Dziwne, bo lokalnie działało. Jako że nie mam dostępu do konfiguracji Jenkinsa to i tak bym nie zidentyfikował problemu. Podszedłem do problemu pragmatycznie: usunąłem nadmiarowe wywołanie verify() i nieużywanego Mocka w jednym teście.
10:08 Rozpocząłem synchronizację z repozytorium.
10:11 Zmiany zacomitowane.
10:12 Wystartował kolejny build.
10:23 Build zakończony sukcesem, banan na ustach, można iść na herbatę.

Na całe szczęście mój obecny projekt jest jeszcze we wczesnej fazie wytwarzania, więc nie było dużo do roboty. Przy czymś większym, gdzie EasyMock jest namiętnie używany, łatwiej było by napisać jakiś skrypcik robiący brudną robotę za nas. Dodatkowo mój zespół ma niewielką wiedzę odnośnie używania mock’ów (i pisania dobrych testów), więc mam kogo ewangelizować :)

Poniżej jeszcze prezentuję przekształcenia z jakich korzystałem. Nie jest to oczywiście pełen zestaw, ale może on stanowić zajawkę Waszych migracji, albo może pomóc zrozumieć różnice między tymi bibliotekami.

import static org.easymock.EasyMock.createMock;
import static org.mockito.Mockito.mock;
createMock
mock
import static org.easymock.EasyMock.expect;
import static org.mockito.Mockito.when;
expect
when
andReturn
thenReturn
import static org.easymock.EasyMock.verify;
import static org.mockito.Mockito.verify;
Elementy do usunięcia:
import static org.easymock.EasyMock.replay;
replay

Do rozpatrzenia:
Przy wywołaniach verify() trzeba dopisać metodę z argumentami jaka powinna się wywołać. Albo jeszcze lepiej zastanowić się nad sensownością testu, gdyż często verify() jest zbędne. Ponadto anyTimes() zazwyczaj trzeba usunąć.

Na więcej problemów nie natrafiłem, ale zdaję sobie sprawę z tego, że przy większym systemie, gdzie EasyMock jest namiętnie wykorzystywany, może nie być tak łatwo. Przy okazji migracji można od razu wyłapać testy które są niedobrze napisane lub są niepoprawne z punktu widzenia Mockito, np. wywołanie verify() przed testowaną metodą.

poniedziałek, 16 kwietnia 2012

DevCrowd 2012

Ledwo 3 tygodnie temu zakończyło się 33 Degree, a tu już kolejna polska konferencja DevCrowd, tym razem w Szczecinie. Konferencja ta jest całkowicie jest przeciwieństwem tej Krakowskiej, jeśli chodzi o wielkość, prelegentów, atmosferę no i cenę. Nie wiedziałem, czy uda mi się wybrać na tą konferencję, ale rzuciłem temat wśród ziomków i z racji dobrego połączenia ze Szczecinem, uczestniczyliśmy w tym wydarzeniu. Przejdźmy od prezentacji.

Na początku udałem się na prezentację Sebastiana Pietrowskiego na temat programowania funkcyjnego w codziennym developmencie. Sebastian opowiadał, czym są języki funkcyjne, po co to i tak dalej. Było trochę przykładów kodu, co jak można w innych językach zrobić, wzmianka o bibliotece Guava, która kilka pomysłów funkcyjnych stara się zaadoptować w Javie.

Później była jeszcze historia na temat tego, co się stało ze słowem kluczowym GOTO i całego sporu na temat stosowalności tego wynalazku. Ciekawa jest ewolucja tej instrukcji, od assemblera, przez programowanie strukturalne (C), obiektowe i w końcu funkcyjne. W Javie słowo goto jest słowem kluczowym (nie możemy nazwać w ten sposób zmiennej), ale nie ma ono implementacji. Mamy za to break i continue, które pozwalają nam wyskoczyć z pętli. Prelegent się mocno zastanawiał, czy w językach funkcyjnych miało by to słowo kluczowe jakieś sensowne zastosowanie i jakie inne ewentualnie konstrukcje językowe mogą podobną funkcjonalność zaoferować.

Generalnie na prezentacji było trochę mało informacji przedstawionych, spodziewałem się trochę więcej. Może coś więcej bym napisał w tym wpisie, ale z racji wszczesnej godziny wyjazdu nie pomyślalem, aby spakować ze sobą notes. Co do samego prelegenta, to jeszcze musi on trochę poćwiczyć wystąpienia publiczne, gdyż było czuć jekkie zdenerwowanie i prezentacja jak dla mnie byla mało ciekawie prowadzona.

Następnie było wystąpienie Jacka Laskowskiego, którego nikomu chyba przedstawiać nie trzeba, na temat Clojure'a, Jest to temat którym Jacek się od dłuższego czasu zajmuje, opisuje na blogu i przedstawia na konferencjach. Wcześniej raczej z daleka omijałem ten wynalazek, chyba ze względu na składnię pełną nawiasów i moje słabe rozeznanie paradygmatu funkcyjnego. Ostatnio jednak się przekonuję, że trzeba się przyjrzeć temu językowi (a na pewno jakiemuś funkcyjnemu).

Co jest w Clojur'ze takiego wspaniałego? Mnie np. zachwyciła obsługa wielowątkowości, którą przedstawił Venkat na 33 degree (więcej we wpisie: 33 degree 2012 dzień 2). Jacek przedstawił jednak temat w inny sposób.

Jako że na sali byli programiści obiektowi, prelegent starał się porównać byty obecne w Javie do tych które występują w Clojure. I tak w Javie mamy klasy, które posiadają metody, a klasy są agregowane w pakiety. Innymi słowy pakiet to zbiór klas, a klasa to zbiór metod. W programowaniu funkcyjnym mamy funkcje (jako byt podstawowy), które są agregowane w pakietach. Nie wiem czy to poprawne określenie w ramach tego języka, ale to co musimy sobie uświadomić, to to, że odpowiednikiem klasy w programowaniu funkcyjnym jest pakiet. W dalszej części prezentacji Jacek udowodnił tą tezę w kodzie.

Aby dalej zrozumieć temat, prelegent kazał się zastanowić, co robimy w programowaniu obiektowym. Mianowicie tworzymy obiekty, przekazujemy je jako argumenty metod i możemy je również otrzymać jako wynik wywołania jakiejś metody. W programowaniu funkcyjnym możemy funkcję (analogicznie jak obiekt) przekazać jako argument funkcji, zwrócić jako wynik i przypisać do zmiennej (a właściwie do stałej). Porównanie to dało mi sporo do myślenia.

Dalej Jacek kodował na żywo. Pokazał, jak można wywoływać rzeczy napisane w Clojure z poziomu Javy. Można skompilować kod pisany w Clojure do bytekodu, w taki sposób, aby było to widoczne przez klasy Javowe. Do tego automatycznie się generował plik JAR, który już w sobie miał wszystkie potrzebne biblioteki wymagane przez Clojure. Dzięki temu wystarczy zaimportować plik do projektu i używać po jawowemu. Jacek przez to zachęcał do pisania po kryjomu w projekcie kodu w tym funkcyjnym języku, bo i tak będzie działało. Na pewno duże zdumienie by było podczas review takiego kodu...

Bardzo mi się jeszcze spodobało spostrzeżenie, że wszystkie języki kompilujące się do bytecodu JVM’a, to tak naprawdę dostarczają nam ten sam produkt (bytecode), ale w trochę inny sposób. Tak więc na poziomie bytekodu języki te są nie rozróżnialne! Czy Java jest w tej sytuacji jakoś uprzywilejowana? NIE! Po prostu była pierwszym językiem do generowania bytecodu.

Co do samego wystąpienia Jacka, to poziom jak zwykle wysoki, potrafił zaciekawić słuchaczy, nawiązać dialog z publiką i zmusić ją do myślenia. W tytule prezentacji było o zastosowaniach serwerowych i spodziewałem się prezentacji jakiegoś framework’a Webowego do Clojura, a był pokazany prosty serwerek, który odbierał żądania http. Więcej, co pokazał Jacek, możecie przeczytać na jego angielskojęzycznym blogu.

Następnie udałem się na warsztaty ze Scali z Łukaszem Kuczerą (@lkuczera). Były one zaplanowane na 3 godziny plus przerwa obiadowa. Początkowo Łukasz wprowadzał nas do języka, dużo o nim opowiadając. Ja kilka dni przed konferencja poczytałem trochę i coś tam napisałem sobie w Scali, aby nie być całkiem zielonym. Dzięki temu na części wprowadzającej w język wiedziałem już co nieco, przez co tematy które nie do końca rozumiałem stawały się jaśniejsze. Do tego dostałem w piątek licencję na IntelliJ IDEA, w zamian za opisanie wrażeń z 33 degree. Mogłem więc od razu zobaczyć jak nowa wersja IDEI radzi sobie ze Scalą.

Później był obiad (zapewniony przez organizatorów). Do wyboru były pierogi, lub kurczak, a całość była dostarczona w styropianach pewnie przez jakąś lokalną firmę cateringową. Dzięki temu można było z obiadem iść gdziekolwiek i wraz z Marcinem Saneckim poszliśmy na zewnątrz na słoneczko. Tam już siedział Jacek Laskowski z Sebastianem Pietrowskim na krawężniku (w pobliżu nie było ławek) i zaprosili nas do wspólnego jedzenia.

Jacek bardzo pochwalił moje wpisy na blogu i nakręcił mnie do dalszej aktywności w tym kierunku. Jeszcze inne bardzo ciekawe tematy się wywiązały, ale lepiej o nich tutaj nie wspominać ;)

Po smacznym obiadku wróciliśmy dalej poznawać zakamarki Scali. Nie będę tutaj opisywał cech języka, ani tego o czym Łukasz opowiadał, bo było tego sporo, a jako świeżak w temacie nie chciałbym nikogo wprowadzać w błąd.

Następnie uczestnicy podzielili się na 2 części i zaczęliśmy w końcu kodować. Generalnie był trochę problem z tym co chcemy napisać, ale w końcu postanowiliśmy napisać parsera wpisow na bash.org, który będzie je zapisywał w bazie danych. Tak więc jeden zespół pisał bazę, a drugi (w którym uczestniczyłem) pisał parsera dla podanej strony. Nie poszlo nam zbytnio, polegliśmy na wyrażeniach regularnych i parsowaniu html’a.

Podczas tego szkolenia zdałem sobie sprawę, jak trudno jest poprowadzić warsztat dla nowicjuszy z nowego języka programowania. Jak dobrze przygotować zadania, aby uczestnicy w ciągu kilku godzin mogli coś napisać i wyjść z warsztatów z przeświadczeniem, że się czegoś nauczyli? Odpowiedź na pytanie z pewnością nie jest łatwa. To, że się nie pamięta podstawowych konstrukcji  języka i nie zna jego API, sprawia, że jednak każdy musi w domu sam usiąść z książką / tutorialem i poprostu zacząć pisać. Czy da się zrobić to jakoś podzczas kilkugodzinnego warsztatu? Nie wiem.

Na zakończenie konferencji było jeszcze rozstrzygnięcie konkursów. Firma SoftwareMill zaproponowała konkurs w którym można było wygrać SonyPlayStation3 Vita. Należało podesłać kawałek kodu, który będzie grał w papier, kamień, nożyce. Bardzo fajna akcja, jednak odpadłem w pierwszej rozgrywce. Było jeszcze losowanie 3ch licencji IntelliJ IDEA, ale już mam, wiec nie brałem nawet udziału :P

Wieczorem była jeszcze impreza pokonferencyjna. Dzięki uprzejmości Andrzeja (który prowadził i zgodził się wracać później) uczestniczyliśmy w after party. I tu było mega pozytywne zaskoczenie, gdyż po wejściu do restauracji zobaczyliśmy białe nakrycia stołów i jedzenie. Przez chwile myśleliśmy, że to jakaś inna impreza, ale zobaczyliśmy innych uczestników konferencji (koszulki konferencyjne przydają się do czegoś), a pani kelnerka jeszcze nas w tym utwierdziła. Nie mogłem się nadziwić, gdyż konferencja była w pełni darmowa, a do tego obiad w trakcie i po (można było spokojnie biegac po dokładkę) i dodatkowo sponsorowane napoje (wiadomo jakie). Wielki szacun dla organizatorów, za taką wspaniałą organizację!

Na wspomnianej afterparty było już mniej osób niż na samej konferencji, przez co atmosfera zrobiła się bardziej kameralno - społecznosciowa. Podpowiedź na przyszły rok: trzeba od razu od samego początku złączyć stoły, aby szybciej zacząć integrację z innymi. Może jeszcze warto zastosowac jakieś techniki sprzyjajace integracji? Myślę, że jest to warte rozważenia.

Z udziału w konferencji jestem bardzo zadowolony, zwłaszcza z możliwosci dowiedzenia się jak IT funkcjonuje w innych miastach (Szczecin), podzielenia sie z innymi swoimi uwagami, jaki i z ogólnego uspołecznienia, oraz możliwości spotkania innych branżowych zapaleńców. Podziękowania dla organizatorów, bo jak na darmowy event, to całość stała bardzo wysoko. Do zobaczenia (mam nadzieję) za rok.

czwartek, 5 kwietnia 2012

33 degree 2012 warsztat z Wujkiem Bobem


W ramach konferencji 33 Degree 2012, po za główną częścią konferencji (opisanej w 3 częsciach: cześć 1, część 2, część 3) wybrałem się jeszcze na warsztat Clean Code z Wujkiem Bobem. Było jakieś 27 osób na tym szkoleniu, stoły poukładane jak w szkole, czułem się jak na lekcjach. Ale przynajmniej lekcja była z nie byle kim. Szkolenie miało formę otwartego, tzn. sami mogliśmy zadawać pytania i proponować tematy, o których będziemy mówić. Niestety jakoś nikt się do tego specjalnie nie kwapił.

Na początku każdy miał się przedstawić i powiedzieć cos o sobie. Wujek Bob notował, kto ile czasu już programuje. Wynik poniżej:


Na początku była znana historyjka na temat symbolu \r\n. Jak wiadomo, w naszej dziedzinie ważne są detale. Następnie Wujek polecał książkę Kent’a Beck’a Implementation Pattern, a następnie znów mówił znaną historyjkę o odwróceniu jednego bitu w swojej głowie.

Następnie było o tym, ze minimalizacja połączeń pomiędzy modułami, ułatwia zrozumienie otoczenia klasy, którą musimy zmodyfikować. I to kod uczy nowych pracowników w projekcie, jak należy pisać. Jeżeli kod jest brzydko utrzymany, to nie ma się co spodziewać, że nowi to poprawią. Dalej będą pisać brzydko.

Później znów było o tym jak w jednej firmie robili redesign całego systemu przez 10 lat. Ledwo wczoraj to słyszałem.

Po przerwie Wujek zaczął w swoim stylu, czyli od wykładu nie na temat. Tym razem było o tym, w jaki sposób policzono odległość Ziemi do Słońca. Dalej było na temat używania słowa spróbuję (ang. try). Nie powinniśmy z niego korzystać, ponieważ dla nas oznacza ono nie, a dla naszego managera znaczy tak. Później była kolejna znana już „przypowieść” o lekarzach, którzy nie myją rąk.

W końcu pojawił się jakiś kod na ekranie. Był to kod klasy org.free.date.SerialDate. Dokładnie ten sam, który był opisywany w książce Czysty Kod. Bob bardzo dogłębnie analizował komentarz do tej klasy i sukcesywnie wywalał z niego elementy, które był tam zbędne. Prelegent używa w swoim IDE czerwonego koloru do wyświetlania komentarzy. Dzięki temu wie, gdzie ktoś miał problem z napisaniem czytelnego kodu i musiał się wspomóc komentarzem.

Później uczestnicy kursu mieli podopisywać trochę testów do tej klasy na swoich komputerach. W tym czasie prelegent chyba nagrywał fragmenty do swoich nowych filmików.

Po kolejnej przerwie Bob opowiadał kolejną znaną swoją historyjkę o artykule z gazety, że powinien on mieć nagłówek (który przekazuje główną informację), a potem są detale dla zainteresowanych. W przypadku Javy jest całkiem podobnie, jedynie zmienne definiujemy na górze klasy. Dla prelegenta jest to głupa konwencja, ale wszyscy się jej trzymają, więc trzeba programować w taki sposób.

Następnie było o długaśnej metodzie z FitNesse’a, która operowała na kilku poziomach abstrakcji i była stworzona przez kopiuj – wklej. Dalej była kolejna opowiastka, tym razem o mamie, która kazała mu sprzątać w pokoju. Analogia dla nas jest taka, że póki jesteśmy w jednoosobowym pokoju, to możemy mieć dowolnie wielkie bagno, byle byśmy się w nim odnajdowali. W przypadku gdy pracujemy zespołowo, to niestety musimy zadbać o porządek. Jeśli nie możesz wyekstrahować metody, to powinieneś ją wyekstrahować (prawdopodobniej jest nieczytelna i robi więcej niż jedną rzecz).

Dalej była wzmianka o programowaniu funkcyjnym, które jest pozbawione efektów ubocznych. Następnie było o rozróżnieniu programowania obiektowego i strukturalnego. Programowanie obiektowe ułatwia dodawanie nowych typów, ale utrudnia dodawanie nowych funkcji.  Programowaniu strukturalnym jest odwrotnie. Nie oznacza to jednak, że nie da się tego łączyć. Da się, ale może to być ciężkie w utrzymaniu. Ciekawe dla mnie było jeszcze stwierdzenie, że w C można programować w sposób obiektowy, poprzez przekazywanie funkcjom innych wskaźników na funkcje.

Dalej było o metodach wieloargumentowych. Tak naprawdę problemem z metodami wieloargumentowymi jest pozycja tych argumentów. Ciężko spamiętać co na której pozycji jest, gdy metoda ma więcej argumentów. Przez to możemy zatracić swój flow w czytaniu kodu, gdyż będziemy musieli wejść na niższy poziom abstrakcji (czyli do wnętrza metody), aby sprawdzić który argument jest czym.

Dalej było o złych zależnościach czasowych w naszych aplikacjach. Przykładowo najpierw musimy wywołać metodę open(), a dopiero później możemy wywołać close(). Jedynym rozwiązaniem jakie widzi object mentor jest przekazywanie do metody otwierającej procedury, która ma się wykonać pomiędzy rzeczywistym open() a close(). Trochę gorzej jest, gdy musimy np. pracować na 2ch plikach równocześnie, bo to powoduje brzydotę kodu.

To tyle jeśli chodzi o pierwszy dzień. Wieczorem miałem to szczęście, że mogłem zjeść razem kolację (i wypić piwko) z Sebastianem i Wujkiem Bobem. Pomęczyłem go jeszcze trochę trudnymi pytaniami i oglądaliśmy razem Kraków nocą. Było to wyjątkowe przeżycie dla mnie. Dzięki Sebastian za organizację tego spotkania!

Dowiedziałem się między innymi, po co Wujek Bob na początku swoich wystąpień robi takie wstępniaki z innych dziedzin. Mianowicie chodzi o poprawę pracy umysłu ludzkiego, poprawę koncentracji i wyostrzenie abstrakcyjnego myślenia. Bob stosuje tą technikę od kilkunastu już lat.

Drugi dzień „treningu” zaczął się od różnych definicji czystego kodu. Były przedstawione te same osoby, które są opisane w książce Wujka Bob’a i ich odpowiedzi na pytanie, czym jest dla nich czysty kod.

Po pierwszej przerwie były zabawy Boba niebieskim laserem. Bardzo ciężko go otrzymać. Istnieje jednak tańsza wersja z domieszką fioletowego, ale nie jest ona taka fajna jak czysty niebieski laser. A ten zostawia ślady na tabliczkach fluorescencyjnych, a świecąc na zwykłe okulary, można zrobić sobie na chwilę okulary przeciwsłoneczne ;)

Dalej było o funkcjach. Te które często wywołujemy, powinny mieć krótkie nazwy i zazwyczaj dużo robią. Później nawiązała się dyskusja na temat używania różnych języków w kodzie, przykładowo polskiego i angielskiego. Czasem jest to wymuszone pewnymi typami projektów, gdzie jest narzucone, że kod musi być pisany po polsku. Niestety Wujek Bob nie miał zbytnio zdania na ten temat, gdyż jego ten problem nie dotyczy.

Później były jeszcze opowieści o wynalazcy notacji węgierskiej (że zarobił fortunę) i o ludzkim kodzie genetycznym.

Następnie Wujek Bob pokazywał przykład refaktoryzacji. Niestety przykład był z książki Martin’a Fowler’a Refaktoryzacja.... Prelegent refaktorował na żywo kod wypożyczalni filmowej. Prelegent zaszedł troszkę dalej niż zrobił to Fowler. To co mnie zaskoczyło, to fakt, ze na samym końcu, klasa która początkowo nazywała się Customer tak de facto powinna się nazywać Statement. Refaktoryzacja pokazała nam prawdziwe przeznaczenie klasy. Był to dla mnie jedyny szok jaki przeżyłem podczas tej prezentacji. Filmik który pokazuje to przekształcenie kodu (ale troszkę inne), został później udostępniony uczestnikom warsztatu. Morał z tego taki, że mając testy można łatwo zmienić design kodu.

Co do zasad Wujka Boba, które stosuje w swoich testach, to czasem rezygnuje on z zasady step down (aby czytać kod od góry do dołu, jak artykuł w gazecie). W testach jest dobrze umieszczać na początku własne assercje. Dzieki temu będzie wiadome, co tak naprawdę testujemy w danej klasie.

Następnie Wujek Bob opowiadał o Katach, a następnie zaprezentował Prime Factors Katę. Można sobie poszukać filmik na necie i samemu obejrzeć.

Później jeszcze robiliśmy „na sucho” problem, jak byśmy napisali algorytm sortowania? Za pomocą małych kroczków i TDD doszlibyśmy do najprostszego algorytmu bąbelkowego. Następnie Bob pokazał ze swojej strony artykuł: The Transformation Priority Premise gdzie przedstawił różne przekształcenia kodu. Twierdził on, że za pomocą tych przekształceń, można dojść z algorytmu bąbelkowego do quicksorta. Trzeba to kiedyś sprawdzić w praktyce.

Na sam koniec szkolenia był jeszcze czas na pytania publiki. Bob mówił o architekturze. Dla niego architektura to nie Tomcat, Spring, JSF i baza danych. Architektura to rozdzielenie tego co system robi (wymagania użytkownika) od technicznych „plug-in’ów” (jak Spring, UI, baza danych). I de facto to co powinniśmy testować, to architektura systemu, czyli wymagania użytkownika, a nie GUI i baza danych.

Było jeszcze pytanie co do programowania defensywnego (zabezpieczanie się w każdej metodzie na błędne parametry)? Według Wujka Boba, należy mieć zaufanie wewnątrz teamu i nie powinno się za każdym razem sprawdzać, czy jakaś wartość nie jest null’em. Natomiast pisząc zewnętrzną bibliotekę, którą będzie używał ktoś inny, należy się już oto zatroszczyć. Mówiąc kolokwialnie, musi ona być idiotoodporna.

Podsumowując dwudniowy warsztat z Robertem C. Martinem jestem trochę zawiedziony. Spodziewałem się usłyszeć więcej, niż jest napisane w książkach Clean Code i The Clean Coder. Żeby chociaż przykłady były z poza tych książek, aby były nowe opowiastki, a nie te już znane przez kogoś, kto przeczytał choć jedną ze wspomnianych książek. No i brakowało mi więcej praktyki na tym szkoleniu. Dla kogoś kto był świeży w temacie przedstawianym przez prelegenta, warsztat na pewno wydal się ciekawy i pouczający. Ja jednak spodziewałem się czegoś więcej.

Jedynie wielki autorytet, szacunek, wspólna kolacja, zdjęcie, autograf na książce i możliwość zadania wielu pytań, ratuje obraz całej sytuacji. Gdyby nie to, byłbym mocno rozgoryczony, a tak jestem nie do końca usatysfakcjonowany. Mimo wszystko cieszę się że wziąłem udział w tym szkoleniu, będę je miło wspominał. Zdjęcie z Wujkiem Bobem trzeba teraz wywołać, w ramkę i na biurku w pracy postawić, aby już nigdy nie pisać brzydkiego kodu ;)

środa, 4 kwietnia 2012

33 degree 2012 dzień 3


Dzień 1
Dzień 2
Warsztat z Wujkiem Bobem

Na początku 3ciego dnia konferencji miałem wielki dylemat na co pójść. Stwierdziłem, że z kolejnej prezentacji Venkat’a dużo nie wyniosę, a Jacka Laskowskiego pewnie jeszcze uda mi się zobaczyć w tym roku podczas innej konferencji. Ostatecznie poszedłem więc na prezentację Andreas'a Krogh'a pod tytułem: Lift from a JEE perspective. O tym framework’u słyszałem wiele dobrego (jest odporny na większość popularnych ataków) i spodziewałem się usłyszeć jak to widzi ktoś, kto go używał a siedział wcześniej w JEE (po prostu tytuł na to wskazywał).

Niestety była to moja najbardziej stracona godzina podczas całej konferencji. Prezentacja była kiepsko przygotowana (dużo tekstu, slajdy które były pomijane, XML’e z konkretną konfiguracją większości bibliotek użytych w projekcie prezentera), ale jeszcze gorzej było z samym prowadzącym, który mówił cicho monotonnie i chciało się tylko spać.

Co do treści prezentacji, to prelegent wymieniał początkowo co mu się w Javie nie podobało. Było o problemach w refaktoryzają (nie pamiętam w którym miejscu), z niedziałającymi testami GUI (przy zmianach w GUI wszystko im się sypało), z internacjonalizacją (m.in. chciano mieć w rzucanych wyjątkach komunikaty w języku natywnym prelegenta). Andreas narzekał, że nie ma w JPA standardu obsługi dla Lazy associations i że trzeba dużo kodu wygenerować na potrzeby DAO. Ponadto JSF jest pewnym standardem, ale mało kto go do końca rozumie, a alternatywne rozwiązania też mają sporo wad.

Później były przedstawiane już wcześniej wspomniane konfiguracje XMLowe i masa dziwnych rozwiązań (np. klasa JpaTextField która z JPA nie miała nic wspólnego). Generalnie prelegent brał udział w projekcie gdzie było jedno wielkie wymieszanie Javy i Scali z dodatkiem dziwnych pomysłów. Na koniec było krótkie demo i można było jedyne tam zobaczyć działanie push’a / pull'a oferowanego przez Comet. Dziękujemy temu panu, więcej nie zamierzam iść na jego prezentację.

Następnie byłem na wystapieniu Ken'a Sipe'a o MongoDB, czyli na temat bazy dokumentowej. Baza ta zawiera, dokładniej rzecz ujmując, kolekcje, które zawierają dokumenty. Prelegent pokazywał tworzenie nowej bazy i póki coś w niej nie wyląduje, to nie jest ona zapisywana na dysku.

Z MongoDB mamy możliwość zobaczenia planu wykonania zapytania. Możemy zakładać indeksy na właściwościach rozróżniających typy składowanych dokumentów i przez to poprawić wydajność. Ogółem chcąc coś wydajnie przechowywać w tej bazie, należy najpierw zrobić denormalizację.

Baza ta nie ma transakcji, przez co można bardzo łatwo ją skalować na wiele maszyn. Czyli zgodnie z CAP Theorem, tracimy na jednym, za zyskujemy na innym miejscu.

Następnie było wystąpienie Roberta C. Martina znanego bardziej jako Wujek Bob. Prezentacja była na temat 3 praw TDD. Początkowo wykład zaczął się od omówienia zasady działania lasera. Później było już powtórzenie tego co wujek pisze w swoich książkach. Było o zielonej opasce - symbolu, którego nie może zdjąć gdyż ma obsesję na temat testów i uważa siebie za profesjonalistę. Profesjonalista to ktoś taki, kto bierze na siebie odpowiedzialność za wykonywaną pracę, a managerowie potrzebują profesjonalistów w swoich zespołach.

Później było o krzywej Produktywności vs. Czas, o bagnie (w kodzie) i historia o redesign’ie systemu, czyli rozpoczęciu projektu od nowa, aby uzyskać lepszy design. Jednak zazwyczaj w takim przypadku stary zespól dalej rozwija poprzedni projekt, a ten nowy nigdy nie może dogonić starego. Sytuacja taka może trwać nawet 10 lat. Rozwiązaniem na to jest zasada skałtów, czyli poprzez niewielkie zmiany w kodzie, możemy pozbyć się tego całego bagna.

Dalej było o tym, że TDD zmusza nas do decoupling'u. Powinniśmy ufać swoim testom, analogicznie jak przy skokach spadochronowych, gdzie samemu musimy sobie odpowiednio spakować spadochron. TDD to gra z samym sobą – piszemy niedziałający test, który po chwili działa – i tak w kółko.

Co do tytułowych 3 praw TDD to nie było to: Red, Green, Refactor, a cos takiego:
  • Write no production code unless you have a failing unit test.
  • Do not write more of a unit test than is sufficient to fail. (And not compiling is failing.)
  • Do not write more production code than is sufficient to pass.

Później było trochę pytań od publiczności, m.in. jak wprowadzać zmiany w projekcie. Bob mówił, aby zacząć od siebie i wtedy inni zobaczą, że jest to fajne i również będą tak postępować. A jak nie to iść za radą Martina Fowlera: "Change your organization or change your organization".

Co do testów akceptacyjnych to należy zrobić wszystko, aby były one szybkie. Przede wszystkim jak jeden test sprawdza logowanie, a drugi składanie zamówienia, to ten drugi powinien się obejść bez logowania. Oznacza to, że trzeba czasem podmienić pewne zachowanie system i przez to testy powinny śmigać szybciej.

Następnie była prezentacja Code Craft prowadzona w przedziwnym stylu. Mianowicie Nathaniel Schutta miał 267 slajdów na godzinne wystąpienie, co daje ponad 4 slajdy na minutę. Fakt faktem, na slajdach były pojedyncze hasła, ale były one bardzo zgrane z prelegentem.

Prelegent wymienił kilka ciekawych narzędzi, których nie znałem, jak crap4jCrucible (do robienia review kodu), Clover (do prezentowania statystyk buildów – wykresów, pokrycia, można dużo konfigurować), Jester (do testów mutacyjnych, ciekawe jak on ma się do PIT’a) i Simian (detektor kodu pisanego metodą Copiego-Pastea).

Co do prowadzania zmian w projekcie (np. wprowadzenie FindBug’a), to prelegent przedstawił ciekawe podejście jak to robić. Nie można włączyć od razu wszystkich możliwych dobrych reguł jakie są, bo to spowoduje wyświetlanie brzydkich wykresów jakości kodu i nikt z tym nic nie będzie robił, a kod będzie dalej gnił. Trzeba na początek włączyć tylko kilka reguł, poprawić kod i sukcesywnie dołączać dalsze reguły.

Inną ciekawą rzeczą jest aktualizowane przez świeżaków Developrs handbooks, czyli dokumentów tłumaczących jak skonfigurować środowisko, jakie są standardy w projekcie itd.

Kolejnym ciekawym pomysłem, jest nagrywanie filmików, ze spotkań na których są podejmowane ważne decyzje projektowe. Jak się po jakimś czasie okazuje, że została podjęta jakaś zła decyzja w projekcie, to można zawsze wrócić do nagrania i przypomnieć sobie dlaczego tak to się stało a nie inaczej.

Następnie był wykład Jurgen Appelo pt. How to Change the World. Prelegent jest autorem książki Management 3.0 i podczas prezentacji opowiadał, jak można przekonywać innych ludzi do czegoś. Bazował na kilku książkach m.in. Influencer, Leading Changes, Fearless Change. Jedna z ciekawych metod wpływania na innych współpracowników, jest przedstawianie nowych pomyslów, podczas wspólnego jedzenia. Pewnie to wynika z tego, że rozmówca może na wtedy poświęcić więcej uwagi, niż gdy siedzi przy biurku i właśnie go wyrwaliśmy z flow.

Był jeszcze przedstawiony wykres innowacyjności, The Feedback Door (czyli karteczki przylepiane na drzwiach, aby dawać feedback) i jeszcze parę abstrakcyjnych przykładów, jak wprowadzać zmiany. Generalnie książkę autora można ściągnąć z ze strony management30.com.

Na koniec 3ciego dnia został wykład Wujka Boba. Standardowo na początku było trochę o fizyce/biologii, że ludzie mają 3 receptory koloru, a składowe RGB również są trzy.

Tym razem wykład był prowadzony kompletnie bez użycia rzutnika (kto by się tego spodziewał w tych czasach). Jedynie prelegent miał małe karteczki z notatkami do pomocy (których i tak prawie nie używał).

Bob tłumaczył nam, jak pracują obecni inżynierowie. Owocem ich pracy jest zazwyczaj jakiś dokument, który później się przekazuje dalej i ktoś go realizuje. Przykładowo architekci tworzą plan budynku, wraz z tym jak ma być urządzone wnętrze. Przekazują dokument ekipie budowlanej i ta już działa. Elektronicy przykładowo projektują płytkę / układ scalony, przekazują do fabryki i ta wytwarza gotowy produkt.

A jak to jest w naszej profesji? Co jest tym dokumentem, który generujemy i który dajemy fabryce do realizacji produktu? Okazuje się, że jedynym słusznym dokumentem wytwarzanym przez inżynierów oprogramowania jest kod źródłowy. Nie stosy dokumentacji fachowej, technicznej, analitycznej i jeszcze nie wiadomo jakiej, a kod. Kod jest zawsze aktualny i prawdziwy. Kod prawdę Ci powie. Fabryką w tym przypadku jest kompilator, który generuje zbiór bitów, czyli działającą aplikację.

Zasadniczą różnicą, pomiędzy naszą a innymi działkami szeroko pojętej inżynierii, jest to, że w naszym przypadku koszt przekazania kodu kompilatorowi, czyli wygenerowania gotowego produktu, jest zerowy. Tak więc wprowadzanie zmian jest tańsze niż w innych dziedzinach inżynierii. Przykladowo, gdyby koszt powiększenia kuchni w wybudowanym już domu (ale nie kosztem innych pomieszczeń) wynosiłby 1000 dolarów, to nikt by jakoś szczególnie nie projektował domów, a jedynie iteracyjnie je rozbudowywał.

Było jeszcze o kryzysie oprogramowania w 1968 i o dokumencie opisującym czym jest model kaskadowy. Podobno jest on na tyle fascynujący, ze każdy powinien go przeczytać.

Dalej była już znana opowiastka, że nasze obecne komputery (jeśli liczyć razem prędkość procesorów, dysków, pamięci i ich ilości) są ileś tam (10^26 jak dobrze pamiętam) razy szybsze od tych z lat 60tych. A dalej programiści piszą te same instrukcje if, for, while...

Pod koniec wykładu był jeszcze czas na pytania. Co do testowania bazy danych, to Wujek Bob ma ciekawe podejście. On generalnie uważa, że nie powinno się jej testować, albo testować w niewielkim stopniu. Generalnie na bazę danych powinno się patrzyć jak na pewną abstrakcję, gdzie są zachowywane dane. Nie powinno nas interesować jak są one składowane, a jedynie powinniśmy, na potrzeby testów, podmieniać klasy dające nam dostęp do tych danych. I tak dla przykładu: w FitNesse, który jest pisany prze Wujka Boba, bazą danych jest płaski plik.

Analogicznie powinniśmy postępować z testowaniem timeout’ów. Jest to też pewne „wejście” do systemu i powinniśmy podmienić je tak, aby testy szybciej chodziły.

I to by było na tyle jeśli chodzi o konferencję. Na koniec były podziękowania od Grześka Dudy i dla Grześka Dudy - organizatora. Ja również dziękuję, bo konferencja była super zorganizowana. Było ponad 630 uczestników, a jakiś wpadek (którym mógłby zapobiec organizator) nie było. Tablica, na której można było przyklejać karteczki, co idzie dobrze a co źle, bardzo mi się spodobała. No i fajnie były przerwy dobrane, tzn. czasem krótkie (aby zmienić tylko sale), a czasem dłuższe (aby pogadać na korytarzu).

Zostało mi jeszcze do opisania, jak wyglądał warsztat z Wujkiem Bobem w którym brałem udział. Ale to w kolejnym wpie.

Na stronie konferencji znajdziecie jeszcze relacje innych osób z 33 Degree 2012.

33 degree 2012 dzień 2

Dzień 1
Dzień 3
Warsztat z Wujkiem Bobem

Pierwszą prezentacją drugiego dnia 33 degree 2012 na którą się wybrałem, było wystąpienie Joonas'a Lehtinen'a na temat Vaadin’a. Jest to framework do tworzenia Interfejsu użytkownika dla „bogatych” aplikacji. Rozpowszechniany jest on na zasadach Apache License. Vaadin bazuje na GWT, jednak nie ma w nim RPC, serwisów dla UI, a kod renderowania widoku znajduje się po stronie serwera. Po stronie serwera przechowywany jest również stan interfejsu użytkownika, co powoduje brak trybu offline.

Po krótkim wprowadzeniu teoretycznym przyszedł czas na kodowanie na żywo. Do stworzenia projektu wymagany jest jedynie web.xml i jeden JAR. Prelegent pokazywał jak stworzyć prostą przeglądarkę / edytor stron HTML. Podobało mi się rozwiązanie Lazy Loadingu, np. gdy w rozwijanej liście, przewijając suwakiem w dół, ściągały się na życzenie potrzebne elementy. Na pewno generuje to sporo requestów do serwera, ale funkcjonalność ta mi się spodobała.

Kolejna rzecz która mi przypadła do gustu to spor ilość kontrolek, które mogą być od razu powiązane z różnymi źródłami danych. Gdy modyfikujemy jednocześnie te same źródła danych w jednym komponencie, to zmiany te są od razu widoczne w innych / różnych komponentach, które mają podpięte to samo źródło zasilania danych.

Co do dalszych zalet Vaadina, to jest fajny edytor Drag&Drop do Eclipsa / IDEI. Framework działa również na urządzeniach mobilnych i mamy od razu zdefiniowane kilka tematów kolorystycznych do wszystkich komponentów. Można pisać własne nowe komponenty (trzeba trochę grzebać w GWT) i mamy stronę skupiająca te komponenty. Można je ściągać i bezproblemowo integrować z edytorem.

Aplikacje Vaadinowe można podobno pisać w dowolnym języku działającym na JVM. Wspiera on IE6, nie trzeba instalować żadnych dodatków do przeglądarki, a samą aplikację można umieścić na dowolnym serwerze wspierającym Servlety. Na stronie framework’a jest dostępna darmowa książka do nauki, jak i tabela porównująca konkurencyjne rozwiązania. Prowadzący polecał przy okazji REFcardz DZone do nauki nowych technologii.

Co do prezentacji to była ona bardzo fajnie prowadzona, były przykłady, kodowanie, animacje pomiędzy slajdami, ale nie za dużo – dobrane z odpowiednim wyczuciem. Po prostu dobrze przygotowana prezentacja.

Następnie poszedłem na wykład Vogel’a na temat nowych funkcjonalności w Androidzie 4.0. Słychać było mocno niemiecki akcent prelegenta. Na prezentacji było trochę przykładów i kodu. Ogółem dobra prezentacja.

W nowym Androidzie dodano m.in. nową kompozycję kolorów, GridLayout, możliwość zmieniani rozmiarów widget’ów, obsługę Drag&Drop. Doszło jeszcze TextureView, Calendar API, ViewPager (do przesuwania (slidowania) ekranów), Fragments (dzięki czemu ułożenie telefonu zmienia layout) i Properties for Animation API. Jeszcze by się trochę poznajdywało, więcej na prezentacji Vogel'a.

Ciekawym rozwiązaniem jest biblioteka napisana na starsze wersje Androida, emulująca nowe gadżety. Ciekawie jak z jej używaniem.

Następnie wybrałem się ponownie na wykład Venkat’a. Tłumy szalały, miejsca pod ścianami i w drzwiach były obsadzone. Ty razem najlepszy prelegent konferencji opowiadał o programowaniu wielowątkowym. Było sporo kodowania na żywo i w dodatku jemu to wychodziło! Świadczy to o wysokim profesjonalizmie Venkat’a.

Zapamiętałem bardzo fajny trik, który może oszczędzić nam na prezentacji ewentualnych wpadek podczas kodowania na żywo. Mianowicie można tuż przez prezentacją naklepać dokładnie to do czego mamy dojść, a następnie stopniowo usuwać napisane linijki w odwrotnej kolejności, w jakiej chcemy je przedstawić. A na samej prezentacji wystarczy już wciskać kombinację Ctrl + Z i kod będzie się przyrostowo pojawiał przed oczami.

Prezentację zaczęliśmy od standardowego książkowego przykładu z klasą Account, na której można wykonać operacje deposit() i withdraw(), czyli przelać kasę z jednego konta [bankowego] na drugie. Czyli mamy prostą logikę: jeżeli na koncie jest wystarczająco kasy, to ją pobieramy i deponujemy kwotę na innym koncie. Wiadomo nikt nie chce aby znikły mu pieniądze z konta, więc trzeba dobrze to oprogramować. No i zaczęło się.

Prelegent implementował na żywo sugestie proponowane przez publiczność. Jak po chwili dotarliśmy do synchronizacji dwóch obiektów, to się okazywało, że przez to może powstać dead lock. Później rozwiązanie zaczęło ewoluować do monitora, aby ostatecznie prelegent ujawnił preferowane eleganckie rozwiązanie. Mianowicie można dodać do naszego projektu bibliotekę z Clojure’a i już możemy się cieszyć ładnymi transakcjami. Jeśli będziemy chcieli wykonać jakąś „wrażliwą” operację poza transakcją, to biblioteka rzuci nam odpowiednim wyjątkiem i trzeba będzie poprawić kod.

Rozwiązanie bardzo eleganckie i trzeba koniecznie przyjrzeć mu się z bliska. Prelegent twierdził jeszcze, że Clojure jest jedynym bezpiecznym językiem programowania dla JVM’a. Mi ta prezentacja uświadomiła, że obecnie w czasach serwerów aplikacyjnych i super framework’ów mało kiedy piszemy coś na wątkach. A wiedza ucieka. Ja z tego powodu zajrzałem do książki Core Java 2 Techniki zaawansowane (Rozdział Wielowątkowość -> Synchronizacja), aby przypomnieć sobie jak to się powinno robić w czystej Javie.

Następnie, po przerwie obiadowej udałem się na prezentację Sławomira Sobótki na temat technik w inżynierii oprogramowania. Początkowo zaczęło się od charakterystycznych terminów, które można poczytać na blogu prelegenta: 8tysiecznik, osobliwość, boska klasa, ofiary muszą być. Ale na szczęście nie było o tym :)

Sławek przedstawił kilka technik, których stosowanie ma sens w większych projektach. Część z nich w jakiś tam sposób łączy się z DDD (o którym Sławek prowadził później warsztaty), ale można je również stosować po za światem DDD. I tak baza danych nie jest modelem. Model to coś co można pokazać (np. model samochodu, domu), a nie właściwości zapisywane na temat danego modelu. Baza danych może być jedynie strukturą danych, która służy do modelowania.

Kolejną pomocną techniką, o której często zapominamy, to zastosowanie Value Object’ów. Czyli tworzymy sobie abstrakcję, przykładowo klasę Money, aby nie przekazywać wszędzie double (wiadomo dlaczego, było to na 3ch prelekcjach wałkowane). Value Object pełni w tym momencie rolę Adaptera pomiędzy typem technicznym, a domenowym.

Kolejną techniką jest stosowanie Agregatów, aby opakowywać anemiczne encje. Można dodatkowo tworzyć transformacje tego samego obiektu domenowego, zależnie w jakim kontekście jest on używany. Przykładowo pracownik magazynu i pani księgowa inaczej patrzą na ten sam byt, jakim jest faktura. Interesują ich inne dane z tej faktury, jak i mogą wykonywać odmienne operacje na niej.

Następnie było o zasadzie OCP w praktyce. Czyli powinniśmy tworzyć polityki w odpowiednich miejscach, w których mogą później przyjść zmiany. Dzięki temu nasz kod będzie łatwiej rozszerzalny, jak kiedyś przyjdzie konieczność innego sposobu wyliczania podatku, rabatu, czy wypłaty. Dobry kod powinien dać nam w tedy możliwość napisania nowej klasy, implementującej zdefiniowany interfejs, w celu spełnienia wymagania. Zyskujemy również dzięki temu na testowaniu i czytelności kodu (zamiast dopisywać kolejne if’y).

Było jeszcze m.in. zalecenie, aby umieszczać cały zły coupling w fabrykach – smutnych miejscach systemu, czyli w „czarnych dziurach”. Było jeszcze o zastosowaniu wzorców Wizytator i Kompozyt.

Podsumowując wystąpienie Sławka, stosując się do zaproponowanych prze niego technik można uzyskać logikę aplikacji z dużą liczbą zależności, ale za to z prostymi metodami. Więcej można poczytać na blogu Sławka.

Następnie chciałem iść na prezentację Jarosława Pałki, aby posłuchać o architekturze. Niestety wykład został odwołany a w jego miejsce wskoczyło cos innego. Ciężko również było się dostać inne wykłady (z powodu tłoku), więc sobie zrobiłem przerwę.

Następnie znów poszedłem na prezentację Venkat’a, tym razem na temat Scali. Prelegent pokazywał jak w Scali łatwiejsze jest używanie XML’a (nie trzeba jak w Javie całości zamykać cudzysłowami). Język ten jest zorientowany na używanie finalnych obiektów. Można kodować w stylu imperatywnym jak i funkcjonalnym. Można bez przeszkód mieszać te style.

Dalej było o różnicach pomiędzy var a val i że jest to lepsze niż final w Javie. Również nie trzeba na każdym miejscu pisać co jakim typem jest, jedynie tam gdzie jest to niezbędne. Słowo return jest opcjonalne, podobnie jak i średnik. Scala daje nam za darmo konstruktor gettery i settery. Mnie ucieszył fakt, ze nie ma metod statycznych (na pewno poprawia to testowalność kodu). Mamy za to coś takiego jak  wbudowany wzorzec Singeleton w język (object). Również w Scali mamy strategię (za pomocą słwa kluczowego trait).

Na koniec dnia poszedłem jeszcze na sesję BoF m.in. Jakuba Nabrdalika na temat porażek. Cieszę się, że prelegenci nie bali się mówić o swoich niepowodzeniach. Przykładowo u nich w projekcie okazało się, że samoorganizujące się teamy nie działały najlepiej. Potrzebna była osoba decyzyjna, bo demokracja nie zawsze jest najlepsza. Było jeszcze trochę o innych porażkach. Dobrze czasem posłuchać, że nie tylko nam się coś nie udaje.

33 degree 2012 dzień 1

Dzień 2
Dzień 3
Warsztat z Wujkiem Bobem

Konferencja 33 Degree 2012 zaczęła się od szybkiego 10minutowego przywitania o godzinie 9:10 przez organizatora Grześka Dudę. Potem było chwilę o platynowym sponsorze Luxoftcie i o 9:25 zaczęła się pierwsza prezentacja Raffi’ego Krikorian’a z Twittera. Opowiadał on o powodach migracji z Ruby on Rails do JVM’a.

Twitter posiada 100 Milionów użytkowników, którzy tworzą 250 Milionów twittów na dzień, co daje prawie 3000 tweetów na sekundę. Serwis ten cechuje ogromna liczba równoległych połączeń, wiele operacji I/O i nie wielka liczba obiektów trwałych. Twitter potrzebował więc wydajnego języka, do obsługi takiego obciążenia.

Początkowo serwis ten był pisany w Rubym. Sam język nie jest zły, pisze się w nim przyjemnie, szybko, jest bardzo ekspresywny. Słabym punktem są w nim garbage collector i wielowątkowość. Nie wiem jak działa zrównoleglanie w Ruby’im, ale według Raffiego nie dawało to rady, nawet na 60 rdzeniach.

Postanowiono wiec zmigrować kluczowe części systemu na wirtualna maszynę Javy. Początkowo wybór padł na Scalę. Jest ona funkcyjna, ekspresyjna, elastyczna, statycznie typowana i z dobrą współbieżnością. No i do tego jest piękna. Po za Scalą Twitter jeszcze używa Clojure’a. Było jeszcze coś wspomniane o bibliotece Finagle powstałej w Twitterze, ale nie pamiętam w jakim kontekście.

Ogółem prelegent fajnie gadał, chwilowo mikrofon nie dawał rady. Mi trochę brakowało więcej konkretów, jakie rozwiązania zostały zastosowane i co się gdzie sprawdziło. Z chęcią również bym zobaczył model bazodanowy. Było jedynie wspomniane, że dzieli się on na 4 części (Timeline storage, twitts, social graph i user storage).

Następny był wykład Ken’a Sipe pod tytułem Complexity of Complexity. Zdania na temat tego wykładu są podzielone, jednym się podobał, ale mi nie do końca. Generalnie głównym przesłaniem wykładu było to, że nie ma jednego rozwiązania dobrego do wszystkiego i należy poszukiwać najlepszej drogi.

Jak dla mnie to Ken za bardzo skakał po różnych tematach. Było o modelu dreyfus’a, CAP Theorem i jeszcze paru sprawach. Prelegent wspominał, że SOAP nie zawsze jest dobrym rozwiązaniem, gdy w danej infrastrukturze występują spore zależności pomiędzy komunikującymi się systemami. SOAP ładnie to na schemacie przedstawia, ludziom biznesu się to podoba, ale de facto te zależności dalej pozostają.

Był przykład z liczeniem: 2.0 – 1.1 (o tym więcej za chwilę), o adnotacji @Immutable z Groovi’ego i książce: Hackers & Painters. Oraz że eBay nie stosuje rozproszonych transakcji.

Podsumowując, to najważniejszy jest dobry zespół, język (z odpowiednim poziomem abstrakcji) i design aplikacji. Co do stosowanych języków, to powinny one być wygodne, łatwe, znane i proste do nauczenia przez świeże osoby w projekcie.

Następne było wystąpienie Venkat’a Subramaniam’a. Już jakiś czas temu byłem nakręcony na jego wystąpienia, gdyż były mocno wychwalane przez innych polskich blogerów (niestety nie pamiętam gdzie to czytałem). I rzeczywiście sposób prowadzenia prezentacji jest pierwszorzędny, istny majstersztyk. Prelegent zaprosił jedną osobę na scenę i czasem prowadził z nią dialog. Pytał, jak się czuje jako programista, czy odczuwa przyjemność z tego co robi.

Venkat mówił o „Pointy haired bosses” i pragmatycznych programistach. Czyli o zderzeniu dwóch światów: bezmyślnych szefów i programistów. Zastanawiałem się o co chodzi z tym pierwszym terminem, ale wystarczy spojrzeć na pewną postać z komiksów Dilberta: Pointy-haired Boss i już jest wszystko jasne.

Venkat opowiadał dalej o pewnych uniwersalnych prawdach. Porównywał managerów, do rekinów, z którymi musimy walczyć (niczym Janek Lisewski ostatnimi czasy). Ponadto najważniejsi w projekcie są... ludzie. Nie metodyki, technologie, a ludzie. Projekt nie wygrywa ze względu na proces a na ludzi. Aby wygrać ludzie muszą mieć pasję, kompetencję i odpowiedzialność.

Dwoma słowami jakich nienawidzi Venkat to „Best Practice”, jeżeli są one wypowiadane bez kontekstu. Jeśli jest inaczej to trzeba uciekać.

Następnie prelegent prezentował zabawne filmiki, o tym jak ludzie mogą wpływać na innych. Tłumaczył wpływ praktyk (przykład z szerokością silników rakietowych) i że zawsze powinniśmy pytać dlaczego. A do szefa to zamiast mówić, że „mamy problem”, to należy mówić, że „mamy wyzwanie”.

Venkat odwoływał się również do książek: Dreaming in Code i do The Paradox of Choice: Why More Is Less.

Prelegent mówił również, że standaryzacja rozwiązań przed innowacją, to zła droga. Najpierw należy coś wynaleźć, znaleźć kilka następnych, możliwych, ponownych zastosowań, dopiero ustandaryzować i na koniec sprzedawać. Niestety sporo rzeczy w świecie Javy nie idzie tym torem, gdyż często do danej specyfikacji (która powstawała latami), dopiero jest dopisywana implementacja. Jako przykład framework’ów, które szły tą lepszą ścieżką Venkant podał Rails’y i Spring’a.

Następnie zostały wytłumaczone różnice w językach programowania na podstawie wykresu podobnego jak poniżej.



Następnie było trochę praktyki, czyli ponownie lekcja liczenia. Proponuję każdemu odpalić i sprawdzić co się stanie (jeśli jeszcze ktoś nie wie).
System.out.println(2.0 - 1.1);
System.out.println(new BigDecimal(2.0).subtract(new BigDecimal(1.1)));
System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.1")));
Przykładowo w Groovy’m mamy to za darmo.

W kolejnym przykładzie Venkant przedstawił bardziej interesujący kod:
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.remove(0);
System.out.println(numbers.size());
Podczas prezentacji dałem się nabrać i dziwiłem się z wyświetlanego wyniku. Dopiero pisząc tego posta zrozumiałem co się dzieje.

To  że Java jako język jest silnie typowany i ze statyczną kontrolą typów sprawia, że musimy się dostosowywać do kompilatora, np. poprzez deklarowanie w sygnaturze metody Checked Exceptions. Podsumowaniem całego wykładu była sentencja: „A Professional who doesn't learn to fail, fails to learn”. Let’s be a champions.

Po wykładzie był obiad, bardzo smaczny. Nieporównywalny z innymi konferencjami w których brałem udział.

Następna prezentacja na którą się udałem była o Dart’cie a przedstawiał ją pracownik Google’a, a dokładniej z Chrome’a: Mike West. Dart to nowopowstający opensource’owy język do budowania web aplikacji, kompilowany do JavaScript’u. Jest to dopiero technology preview, więc nie ma jeszcze nawet wersji alfa tego wynalazku.

Najciekawszy jest sposób powstawania języka. Mianowicie tęgie głowy wymyślają, co by tutaj dodać do języka, a społeczność dyskutuje na grupie o danej funkcjonalności i od tego zależy, czy pojawi się w języku czy nie.

Przeznaczeniem języka mają być małe i średnie aplikacje, niezależne od platformy, szeroko dystrybuowane i bez instalacji. Dart bazuje na HTML’u 5 i modelu DOM, ma być wsparcie dla testów jednostkowych. Przy języku pracuje sporo ludzi od GWT i język ma być bardziej popularny od CoffeeScript’a.

Na prezentacji było trochę kodu, ale ja osobiście jakoś się nie przekonałem i coś nie czuję aby to wypaliło. Jednakże model powstawania języka jest bardzo ciekawy. Co do samej prezentacji, to troszkę dziwna akustyka była w sali a i prelegent jakoś mało ciekawie przedstawiał temat.

Następna prezentacja była bardzo ciekawa. Andrey Breslav pracownik JetBrains’a przedstawił język Kotlin  (nazwa dokładnie taka jak polskie miasto i firma produkująca keczup). Prelegent obecnie pracuje przy tym wynalazku. Jakiś czas temu widziałem informacje o tym języku, ale się nie przyglądałem bliżej.

Język jest statycznie typowany, ogólnego przeznaczenia, open source’owy i do zastosowań przemysłowych. Kompilowany jest on do bytekodu JVM’a lub do JavaScriptu, tyle że wówczas nie można używać wszystkich bibliotek.

Ciekawa jest motywacja firmy do tworzenia kolejnego języka. JetBrains tworzy aktualnie środowiska programistyczne (IDE) dla 7 języków. Wiodącym jest to dla Javy, ale Java rozwija się bardzo powoli w stosunku do IDEI. Jako że inne języki wspierają produkty tej firmy, to postanowiono wesprzeć samego siebie. I tak oto powstaje język eliminujący niedoskonałości Javy, mający od razu wsparcie IDE do tworzenia kodu. Ponadto można bezproblemowo mieszać kod Kotlina i Javy w projekcie i nawet debugować w jednym IDE. To sprawia, że integracja i ewentualna migracja może być bezbolesna. I jest również dostępne wsparcie dla podpowiadania składni, refaktoringu itd.

Kotlin nie jest research’owym projektem, ani nie jest pod specyficzną domenę, czy może raczej pod specyficzne zastosowanie. Zanim kolejna wersja języka wyjdzie, to jest ona używana na produkcji w JetBrains. Są już nawet jakieś zewnętrzne firmy, które wykorzystują ten język.

Co do samego języka: Nie ma słowa kluczowego new, argumenty przekazywane do konstruktora są od razu zapisywane jako pola klasy, są extension functions, przeciążanie operatorów matematycznych i nie tylko, wyjątki tylko unchecked, operacje bezpieczne na występowanie null’a, inne rzutowanie pozwalające pozbyć się javowego rzutowania i switch’a, Trait’y czyli interfejsy z domyślną implementacją, a adnotacjom można nadać coś jakby alias i później używać w kodzie, co eliminuje znak ‘@’. Mają być również zaimplementowane Run-time generics.

Z ciekawostek, to kod jest kompilowany do modułów, a nie do pojedynczych plików jak w Javie, przez co można lepszą optymalizację kodu wykonać. Kto chce to może się dołączyć do Community i trochę porozwijać język.

Prezentacja była bardzo ciekawie prowadzona. Były filmiki pokazujące jak kodować (opatrzone w razie potrzeby odpowiednim komentarzem prowadzącego). I jak całość działa. Był po raz drugi przykład a odejmowaniem (2.0 – 1.1) z którym Kotlin radzi sobie podobnie jak Groovy (czyli lepiej niż Java). Prezentacja bardzo mi się podobała i uważam, że język może być ciekawą alternatywą w niedalekiej przyszłości dla Javy. Nie wiem dokładniej jak się to ma do innych obecnie coraz popularniejszych języków jak Scala, Groovy, Ruby, ale przyjrzę się jemu bliżej niedługo. Na stronie JetBrains’a można sobie przeczytać porównanie do Javy lub Scali. Widać, że język sporo czerpie inspiracji ze Scali i Grooviego. Można się jeszcze „na żywo” pobawić językiem nie instalując żadnych aplikacji wchodząc na stronę kotlin-demo.

Następnie wybrałem się na prezentację o testach którą prowadził Wojciech Seliga. Opowiadał on o swoich 10 latach testowania przy tworzeniu oprogramowania JIRA. W początkowej części prezentacji było sporo danych statystycznych, wykresów itp. I tak projekt ma: około 500 zależności, 1.5 miliona LOC, 13 tysięcy testów jednostkowych, 1000 testów z Selenium, 4000 funkcjonalnych i integracyjnych, pokrycie kodu testami na poziomie 60-80% do ~92% dla krytycznych funkcjonalności…

Wszystko to jest kompilowane i odpalane na ponad 70 maszynach w chmurze Amazona. Jednak i tak trwa to bardzo długo, a poprawa testów jeszcze dłużej, przez co zaczął się pojawiać u nich w projekcie syndrom wybitego okna. Po pewnym czasie, aby developerom wróciło zaufanie do testów, zaczęto komentować (a z czasem usuwać gdy nie szło naprawić) te testy, które za długo były czerwone – ale nie profesjonalne zachowanie.

Co do ciekawych praktyk, to dowiedziałem się o Page Object Pattern co mocno ułatwia testowanie i jest niezależne od zmian w GUI. A jeżeli już chcemy testować po GUI, to lepiej skorzystać z JQuery Selectors niż z XPatch i/lub używać ID’ków zamiast CSS’a. Dobre jest również podzielenie kodu testowego na moduły, które znajdują się w miarę blisko kodu źródłowego. Pozwala to developerom odpalać testy dotyczące danego modułu, zamiast testów dla całego systemu. Przydatne również może być mockowanie zewnętrznych systemów.

I to by było tyle jeśli chodzi o tą prezentację. Ja spodziewałem się dowiedzieć czegoś więcej, tzn. oczekiwałem przykładów, dobrych rozwiązań, stosowanych wzorców, technik, ciekawych wniosków. Jak na kogoś kto ma dziesięcioletni kontakt z testami, to wypadło bardzo słabo.

Po wykładzie chciałem iść jeszcze na sesję BOF, ale skończyło się na tym, że zacząłem rozmawiać z ludźmi na korytarzu i dołączyłem do imprezy piwnej sponsorowanej przez ZeroTurnaround wydawcę JRebel’a Bardzo mi się spodobała taka forma integracji i możliwości nawiązania kontaktów.

Podsumowanie kolejnych dni w kolejnych wpisach.

piątek, 30 marca 2012

Nowa ksiazka o testowaniu jednostkowym


Dnia 28 marca 2012 pojawiła sie oficjalnie książka: Practical Unit Testing with TestNG and Mockito napisana przez Tomka Kaczanowskiego. Wspominałem w jednym z poprzednich wpisów (na temat testowania wyjatków), że ta książka nadchodzi. Już oficjalnie jest dostępna do kupienia na practicalunittesting.com do czego zachecam.

Dlaczego o tym pisze?

Powodów jest kilka.

Po pierwsze jest to książka polskiego autora (co prawda po angielsku, ale spolszczenie jest w przygotowaniu), a tych należy wspierać. Łatwiej (podobno) jest napisać książkę techniczną po angielsku i później ją przetłumaczyć na nasze, niż pisać po polsku i później się męczyć.

Po drugie jest to kompletny, uporządkowany i aktualny zbiór technik z przykładami, jak pisać dobre testy. Książka wyjaśnia wszelkie wątpliwości związane z nazewnictwem, konwencjami i dobrymi praktykami, jak i daje wiele cennych wskazówek.

Dla kogo jest ta książka?

Książka jest bardzo dobra dla osób, które chcą właśnie zacząć pisać testy jednostkowe do swojego kodu i nie wiedzą jak wystartować. Książka wprowadza krok po korku do lepszego świata kodu pokrytego testami. Również dla startych wyjadaczy znajdzie się sporo cennych informacji. Dalsze rozdziały książki omawiają zaawansowane zagadnienia ze świata testowania. Tomek wskazuje również dobre praktyki jak pisać testy, a także prezentuje narzędzia powiązane z nimi(jak catch-exception czy testy mutacyjne).

Dlaczego więc się wypowiadam o tej książce, skoro dopiero co się ukazała?

Dobra, dość tej krypto reklamy, czas na konkrety ;)

Powodem dla którego piszę na blogu o tej książce, jest fakt, że brałem udział w jej powstawaniu. Mianowicie robiłem korektę (review) książki, za co dostałem podziękowania uwiecznione na jednej ze stron w książce:
In various different ways a number of people have helped me with writing this book – some by giving feedback, others by comforting me in times of doubt.
Marcin Stachniuk was the first person to offer to review the book in the early stages of its being written, and at the same time the most persistent of my reviewers. He read every part of the book and gallantly overcame the obstacles I frequently put in his way: frequent releases, constant juggling of the contents, minor piecemeal adjustments, etc.
Nadszedł teraz czas podzielenia się moimi wrażeniami ze wspólnej pracy z autorem.

Wszystko zaczęło się na konferencji GeeCON 2011 w Krakowie, Podczas (za)ostatniego dnia konferencji (tzw. Community Day) Tomek miał swoją prezentację pt.: Who watches the watchmen? - on quality of tests. Na prezentacji trochę się wynudziłem, gdyż otarłem się już o większość omawianych tam zagadnień. Pod koniec jednak prelegent pochwalił się, że właśnie pisze książkę o testach. Wówczas jeden z uczestników (nazwisko do wiadomości redakcji) zaproponował, że chętnie by zrobił review jego książki. Bardzo zaciekawiła mnie ta inicjatywa, i mimo iż wszyscy już wychodzili z sali, zostałem chwilę dłużej, aby przysłuchać się rozmowie na temat recenzowania książki.

Tomek zaproponował aby chętni się do niego zgłosili mail’owo, aby ustalić szczegóły współpracy.  I tak to się zaczęło. Stwierdziliśmy, że najlepszą formą wymiany informacji będzie założona na Google prywatna grupa dyskusyjna, poprzez którą Tomek będzie podsyłać nowe wersje książki. Tym kanałem można również podyskutować i wyjaśnić ewentualne kwestie sporne. Rozwiązanie to sprawdziło się.

Preferowanym sposobem zgłaszania uwag, było odsyłanie aktualnego pdf’a ze wstawionymi komentarzami w teksie, w formie żółtych karteczek. Funkcjonalność taką daje nam Foxit Reader. Dzięki temu Tomek widział dokładnie, którego miejsca dotyczy uwaga. Było to również wygodne dla mnie, gdyż fragmenty czytałem na ekranie komputera. Niektórzy zgłaszali swoje uwagi w postaci wiadomości na grupie, ale dla mnie żółte karteczki i tak były lepsze, gdyż dokładniej wskazywały miejsce, gdzie jest coś nie tak.

Na podstawie e-maili naliczyłem jakieś 20 „release’ów” książki, tzn. fragmentów, które Tomek podsyłał do korekty. Początkowo przychodziły pojedyncze rozdziały do czytania, ale lepszym wyjściem, jak się później okazało, było podsyłanie całości. Dzięki temu nie było rozdziałów wyrwanych z kontekstu i było widać ogólnego zarys całości książki, w którą stronę ona dąży.

Koleje wersje pojawiały się z różną częstotliwością. Czasem było kilka w tygodniu, a czasem była cisza przez dłuższy czas. Ale to już była kwestia Tomka jak sobie organizuje pracę nad książką. Ze swojej strony mogę powiedzieć, że często nowe wersje się pojawiały, jak akurat mocno byłem zajęty innymi sprawami i niemiałem możliwości aby usiąść od razu do lektury. Kilka razy dogoniła mnie kolejna wersja i wtedy już trzeba było się zmobilizować i przeczytać to co tam Tomek naskrobał :)

Co do zgłaszanych uwag, to Tomek zazwyczaj je akceptował. Jak nie widziałem poprawy w następnej wersji, to początkowo się czepiałem, że moje sugestie są nieuwzględniane, ale w późniejszym czasie doszedłem do wniosku, że nie powinienem się tym przejmować. W końcu to książka Tomka i Jego koncepcja, a nie moja. Jedynie sprawy edytorsko/estetyczne (zła czcionka, rozjeżdżające się tabelki) były dla mnie bardzo irytujące, ale to chyba przez spędzenie dawniej sporej ilości czasu z LaTeX’em. Tomek postanowił zostawić to sobie na sam koniec, przez co ciągle widziałem te niedoskonałości. To była chyba jedyna pierdółka, która mi troszkę przeszkadzała w naszej współpracy.

Moje zaangażowanie zostało wynagrodzone cytowanymi wyżej podziękowaniami w książce (Dzięki Tomek!). Właściwie to nie nawet nie ustaliliśmy szczegółów współpracy, tzn. co ewentualnie będę z tego miał. Do samego końca nie wiedziałem nawet, czy pojawią się te podziękowania w książce (po cichu na nie liczyłem). W końcu w jednej z ostatnich wersji książki zobaczyłem, że są :) Świadczy to o tym, że moje zaangażowanie było kompletnie non-profit.

Podsumowując współpracę cieszę się, że wziąłem udział w tym przedsięwzięciu. Było to bardzo ciekawe doświadczenie i mogłem przez to poznać proces powstawania książki. Robienie review sprawia wielka frajdę, czego zwieńczeniem jest oczywiście ukazanie się książki „na produkcji”. Szczerze polecam każdemu zaangażowanie się w tego typu akcję.


Btw. Co do relacji z 33 degree (kilka osób już o nią pytało), to musi ona jeszcze poczekać kilka dni, z powodu natłoku innych zajęć (w tym korekty ostatecznej wersji książki Tomka), jak i obecnych sporych zmian życiowych.