pondělí 30. prosince 2013

Ohlédnutí za Coderetreatem 2013

V prosinci jsem se opět zúčastnil cvičení pro programátory zvané Coderetreat. Mimochodem, letos to tam nezaznělo, ale byl to Global day of Coderetreat! Tedy akce, která se konala ve stejný den v různých městech po celém světě. A díky společnosti Vendavo dokonce i v Ostravě :-). Nebál bych se i malého zapřehánění si a příště by se mohla pozvat televize, aby natočili krátkou reportáž :-).

Chodím na tyto cvičení rád, protože je to dobrá příležitost se vždy přiučit nějakým novým programovacím technikám. A taky tam člověk pozná nové lidi. Tahle setkání jsou v tomto ohledu mnohem lepší než jen celodenní sezení na přednáškách. Nejen, že se tu člověk něco naučí, ale po celou dobu navíc networkinguje, jelikož se pracuje ve dvojicích, které se každou hodinu mění. Parafrází hlášky z Matrixu, kdy Seraph říká Neovi "Jen při boji poznáš, co je člověk zač." se dá použít "Jen při párovém programování poznáš, co je programátor zač." :-).  Každé sezení, které jsem si zkusil s někým ve dvojici bylo výjimečné a něčím inspirující. Buď v kladném nebo někdy i záporném světle, že takhle by se to dělat nemělo. Tohle je jedna z věcí, které na celém Coderetreatu hodnotím velkým plusem.

Některá cvičení byla zábavná. Jako třeba Religion Driven Develompment v Cucumber.
https://twitter.com/MarianSchubert/status/411849075701858304


Některá byla inspirující, jako třeba tvorba n-rozměrného světa v Clojure (pro mě stále tajemný jazyk :-)

Ovšem nejtěžším cvičením pro mě bylo kdy jsme spolu ve dvojicích nesměli mluvit. Neměli jsme se domlouvat ani přes komentáře a ani žádnými posunky. Komunikaci jsme měli provádět jen přes kód. Bohužel jsme to s kolegou částečně porušili. Byli jsme sice naprosto potichu, ale občas jsme si předali krátký vzkaz přes komentář v kódu. A ani to nám nepomohlo v tom, že jsme si vůbec nerozuměli. Každý z nás psal tu aplikaci jiným způsobem. Pomalu z toho vznikaly dvě aplikace tvářící se jako jedna. Na téhle části cvičení bych měl příště trochu více zapracovat. Aleš Roubíček mě sice ujišťoval, že má pozitivní zkušenost s projektem na kterém komunikovali jen skrze kód, mě to ale spíše přesvědčilo o tom, že nedostatečná komunikace na projektech způsobuje vyvíjení paskvilů.
Nicméně ke konci mi tam svitla jedna myšlenka, jak bychom to asi měli dělat správně pokud chceme komunikovat jen přes kód. A sice požadavky pečlivě specifikovat formou testů. Uvedu to na příkladu:

Dělali jsme klasický ping-pong. Jeden ve dvojici napsal test a předal druhému. Ten napsal implementaci k testu,  vytvořil nový test a předal prvnímu. Tak to šlo dokola. Implementace se měly psát minimalistické. V jednu chvíli jsem dostal test, který šel obejít jednoduše tak, že jsem s minimální úpravou vrátil stejný objekt jaký jsem získal. Původní kód byl samozřejmě smazán. Tady je příklad jak to asi vypadalo:
    public World doSomething(World world) {
        world.setSomething(1);
        return world;
    }
K tomu mi kolega napsal dlouhý komentář, že bychom neměli měnit vtiřní stavy objektů a nejlépe abychom vraceli nové immutable objekty. A v tu chvíli mě to napadlo: Proč mi píše tak dlouhé zbytečné komentáře, když tenhle požadavek může krásně definovat pomocí testu? Odepsal jsem mu tedy "Napiš na to test". A za chvíli vzniklo něco takového:
    @Test
    public void worldIsImmutable_whenDoSomething() {
        GameOfLife gameOfLife = new GameOfLife();
        World originWorld = new World();
        World actualWorld = gameOfLife.doSomething(originWorld);
        assertFalse(originWorld == actualWorld);
    }
Teď už jsem si nevystačil jen s "return world", ale musel jsem tu implementaci trochu upravit. Jinými slovy, když se chce, tak jde komunikovat i jen přes kód :-).

A co do budoucna s Coderetreatem? Nějaká drobná vylepšení by se hodila, jelikož se z toho trochu začíná stávat stereotyp. Když jsem se někoho náhodně zeptal co by on změnil pro příště, dostal jsem odpověď "Pojďme řešit jiný problém." Tady jsem se zarazil. Kdo si jako hlavní myšlenku z celého Coderetreatu odnáší "Game of Life" tak tam byl zbytečně. To o co tam určitě nešlo byla implementace problému Game of Life. Ano, tohle jsme tam sice implementovali. Hodinu co hodinu, celý den, pořád dokola, ale to jen proto, že na něčem se to trénovat musí. A na čem budeme trénovat, je úplně jedno. Takže to co já bych rád do budoucna viděl, je že organizátoři nepoleví z tohoto zadání a že na každém Coderetreatu rok co rok, se bude pořád řešit stejný problém. Že třeba i za 20 let, se tam bude stále implementovat Game of life. Znovu, znovu a znovu. Tak dlouho, aby všichni brali Coderetreat jako cvičení programovacích technik a ne jako řešení problému Game of life.

Během naší debaty v hospodě, Marián poznamenal, že pokud chceme změny, tak by měly přijít podněty o nás, kteří jsme se toho zúčastnili vícekrát. Jak tedy Coderetreat vylepšit? Těžko říct. Napadá mě pár rychlých tipů:
  • Trénovat pojmenování metod a tříd, trénovat maximální srozumitelnost
    • psát to tak aby tomu rozuměli i ti co nemají znalosti programování
    • zkusit to psát česky - je to celkem sranda :-)
  • Vymyslet problém, při kterém by se trénovalo psaní a vyhazování výjimek
    • i psaní výjimek má svá pravidla, např.: 
      • v "try" bloku by se měla vykonávat jen jedna věc
      • po "catch" by se v metodě už nemělo nic vykonávat
  • Zaměřit se na správné psaní funkcí
    • striktně dodržovat, aby dělaly jen jednu věc
    • funkce by neměla mít side efekty
    • používat jeden, maximálně dva argumenty
  • Dodržovat striktně pravidlo, při psaní testů by měl být jen jeden "assert" pro jeden test
Takže kdo jste ještě nebyli na Coderetreatu, neváhejte a příští rok se přihlašte. A ti co jste tam už byli neváhejte a dávejte tipy na vylepšení.