Mob programming

Posledních několik měsíců pracujeme s kolegy pomocí metody mob programming. V jednoduchosti jde o to, že celý tým pracuje u jednoho počítače, jeden píše, ostatní navigují. Funguje nám to úplně skvěle, měli byste to určitě také zkusit. Abych vám to trochu usnadnil, tak tu zkusím sepsat naše zkušenosti.

Výhody

Začnu výhodami. Ta nejzajímavější je pro mě ta, že odpadne většina ceremonií a koordinace. Celý tým pracuje pohromadě na jedné věci, nemusí se tedy koordinovat, dělat schůzky a navzájem se vyrušovat.

Představte si, že rozjíždíte nový projekt. Pokud pracujete klasicky, každý vývojář na vlastním písečku, tak je to celkem složité. Nejdřív musíte vymyslet a rozdělit úkoly pro jednotlivé vývojáře. Jarda bude zakládat strukturu projektu, Pepa bude studovat dokumentaci k externím systémům, Karolína bude chystat testovací prostředí. I když máte náhodou dost úkolů pro celý tým, tak se ti lidé musí neustále koordinovat. Věříte Jardovi, že strukturu projektu založí tak, že bude vyhovovat celému týmu? Co když to bude mít hotové a Karolína vymyslí lepší postup? Je zakládání testovací prostředí opravdu tak důležité, že se musí dělat hned, nebo to děláte jen proto, aby měli všichni co dělat? Jak Pepa předá znalosti dokumentace ostatním?

V mobu je to všechno mnohem snazší. Je nejdůležitější založit strukturu projektu? Všichni to dělají pohromadě. Dokončili jsme to? Všichni se vrhnout na něco jiného. Koordinace tam samozřejmě stejně probíhá, ale přirozeně, v průběhu práce. Vezměme například plánování. Právě jsme něco dokončili a nevíme co dál? Společně vybereme další nejdůležitější věc a vrhneme se na ní. Nemusíme řešit kdo umí co líp, kdo je na co specializovaný. Potřebujete retrospektivu? Není problém, uděláme ji hned. Není potřeba svolávat zvláštní meeting, všichni máme čas najednou. Zpočátku jsme tak třeba retrospektivu občas i několikrát denně a bylo to naprosto přirozené, jenom se tým přepl z módu programování do módu retrospektiva. Code review? Nemusíte na nikoho čekat nebo ho vyrušovat uprostřed rozdělané práce, všechno probíhá hned u každého napsaného řádku. Většina rozhodnutí probíhá okamžitě, čeká se jen na věci, které se z nějakého důvodu řeší mimo tým.

Další zjevná výhoda je kvalita kódu. V našem týmu jsme tři hodně zkušení vývojáři, každý z nás dokáže napsat slušný kód i samostatně. Ale ve třech je ten výsledek o hodně lepší. Když není jasné, jakou cestou se vydat, tak se to okamžitě probere, vybere se nejlepší řešení a jede se dál.

Vyšší kvalita výstupu z mobu u nás vynikne v porovnání s kódem, který vznikne při technických pátcích. V pátek si jednotlivě hrajeme s věcmi, na které není v průběhu týdne priorita. Kód který takto vzniká je prostě na první pohled horší než ten, který napíšeme společně. Dokonce i ten můj.

Je pravda, že kvalitu kódu by určitě zvedlo i párové programování. Ale už se nám několikrát stalo, že si někdo někam odběhl a zbytek pokračoval jen v páru. Po návratu nám ten třetí vymyslel fintu, která řešení výrazně vylepšila.

Třetí velká výhoda je učení se. Každý z nás je v něčem lepší. Když ostatní vidíte přímo při práci, tak se učíte mnohem rychleji. Od jednoho okoukáte finty při editaci, od druhého finty při psaní funkcionálního kódu, od třetího návyky při testování. O kódu diskutujete v podstatě pořád, takže se pořád učíte. A nejen kódování, poznáte jiné pohledy ne design, na to jak si kdo organizuje práci a podobně. Je to neuvěřitelně obohacující.

Na co si dát pozor

Samozřejmě to není všechno procházka růžovou zahradou. Hlavně ze začátku je to celkem náročné. Nebyli jsme zvyklí takto pracovat, takže nám to občas docela skřípalo.

Doporučil bych ze začátku přísně dodržovat pravidla. Řidič by měl poslušně dělat to co mu říká navigátor, neměl by se snažit dělat věci podle sebe. Měl by se chovat jako o trochu chytřejší klávesnice. Pro mě osobně bylo tohle hodně těžké. Jsem přeci zkušený programátor, proč by mě měl někdo navigovat. Je ale nesmírně důležité toto pravidlo dodržovat právě proto, abychom se naučili poslouchat co se nám ten druhý snaží říci. To je věc, kterou (nejen) v mobu potřebujete neustále.

Navigátor by se měl svědomitě snažit určit míru potřeby navigace. Je to podobné jako v autě. Zkušenému řidiči stačí oznámit, že má jet do Brna a pak se jen vézt. Pokud řidič neví kde je, musíte mu radit každé odbočení. A pokud je to řidič začátečník, je potřeba mu radit i to, jaký stupeň má zařadit. S navigováním v mobu je to podobné. Chvíli trvá naučit se poznat, co kdo v daný okamžik potřebuje. I řidič se musí naučit dát vědět, jestli je ztracený nebo jestli je mu všechno jasné, jestli potřebuje vodit za ručičku nebo jestli mu jen stačí naznačit směr.

A pokud zrovna neřídíte ani nenavigujete, musíte se naučit odlišit situace kdy je potřeba mlčet a kdy do toho začít navigátorovi kecat.

Nám se osvědčil časovač, který nás nutil se pravidelně po čtyřech minutách střídat a časté retrospektivy, kdy jsme si vyříkali, co fungovalo a nefungovalo. Časem jsme pravidla postupně opouštěli a nic se nestalo. Věřím ale, že jen dodržování pravidel nám umožnilo naučit se vnímat potřeby ostatní.

Jeden důvod, proč nám to občas skřípalo byla nejasnost zadání. Když si řidič myslí, že jedeme co nejrychleji do Brna a navigátor, že je nutné co nejdřív někde nabrat benzín bez ohledu na zajížďku, tak pak oba nechápou, co ten druhý blbne. Nám pomáhá rozpadnou si story na malé kroky a ukázat si, že teď děláme tohle. Časem jsme se naučili se i zastavit a zeptat se co se děje a nepovažovat toho druhého rovnou za pomateného.

Umět se zeptat toho druhého, proč dělá něco nepochopitelného je důležitá schopnost, bez které se v mobu neobejdete. A opět nejen v mobu.

To mě vede k další nevýhodě mobu. Je to celkem psychicky náročné. Hlavně proto, že kromě kódu musíte vnímat i lidi kolem sebe. Najednou to není jenom o tom, že jsem ponořený v problému, musím si všímat i těch divných bytostí co na mě pořád mluví. Celkem nezvyk. Je proto důležité si pravidelně dělat přestávky, aby měl člověk čas dobít baterky.

Další věc, která mě při mobování překvapila je to, jak jsem závislý na počítači. Jak moc si nepamatuju jména základních tříd, jak moc často potřebuju googlovat. Když navigujete, tak si připadáte jako bez rukou. Chcete řidiči říci, že má použít třídu XYZ, ale nepamatujete si její název. Po čase mě to přešlo, ale ze začátku je to docela síla. Časem se naučíte přiznat si, že nevíte a říci řidiči, že si to má vygooglovat sám.

Co nám nejde dodnes je dubugování. Při hledání chyb potřebujete rychle zkoušet hypotézy a vyvracet nedopečené nápady. To jsme se zatím v konfiguraci řidič/navigátor nenaučili. Dáváme buď víc prostoru řidičovi nebo se každý rozejde na vlastní počítač. Na druhou stranu opravdu záludnou debugovací situaci jsme měli zatím jen dvakrát, v mobu je výrazně větší šance, že si chyby někdo rychle všimne.

Nečekaně dobře nám mob funguje v době koronaviru. Jedeme vzdáleně, sdílíme obrazovku, při střídání pushujeme do Gitu, což zabere pár sekund. Naopak, pokud se někdo potřebuje postarat o děti nebo podlít maso, tak jen odběhne a tým jede dál. Nevím ovšem, jak by nám to vzdáleně fungovalo, kdybychom si na sebe ještě vzájemně zvykali.

Dnes jsme ve fázi, kdy pravidla už moc nedodržujeme, střídáme se když se to hodí, navigují všichni co zrovna neřídí a tak nějak tušíme, jak by danou situaci řešil, který člen týmu. Já vím, že se kluci vyhýbají ifu jak čert kříži, kluci vědí, že nerad používám data classy tam kde nemají být. Občas nám to skřípe, občas si nerozumíme, ale většinu doby máme pocit, že dohromady odvedeme víc kvalitnější práce než by to dokázal každý zvlášť. Takže se nebojte to zkusit. Je to zábava a naučíte se hrozně moc.

Hledám práci

Chystám se zase začít hledat práci. Protože blog používám mimo jiné k ujasnění si myšlenek, zkusím si tu sepsat co a proč hledám. Nečekám, že to bude někdo číst, tradičnější CV, je k dostání třeba tady.

Co nabízím

Moje nejsilnější stránka je programování v Javě na back-endu. Dělám to už dlouho, o Javě a velké části jejího ekosystému vím první, poslední. Na druhou stranu se stále mám ještě co učit. Programování mě navíc baví, takže se ho stále snažím držet.

Jsem fanatik do automatických testů. Jsem přesvědčený, že dobré testy dělají rozdíl mezi udržovatelným kódem a hromadou #$!$#, do které se každý bojí šáhnout. Bez dobrých testů není možný agilní vývoj, continuous deployment a další věci, o kterých všichni básní. Proto udržuji open-source projekt JsonUnit, který kdysi vznikl, protože jsem potřeboval v testech porovnávat JSONy a nic na to neexistovalo.

Pak se taky starám o ShedLock, přispěl jsem do Springu kus kódu na mockování WebServiců a tak. Už jsem říkal, že mě programování baví?

Celkem se vyznám v architektuře. Nicméně zastávám názor, že architektura je věc, která se špatně mění, a takovou věc přeci nechcete. Přijde mi důležitější mít dobré testy, které vám umožní refaktoringem napravit špatná rozhodnutí. Zkrátka, nevěřím v neprogramující architekty a v architekturu vytesanou do kamene.

Další moje silná stránka je selský rozum. Umím se držet při zemi, když dostanu zadání, dokážu v něm najít to důležité a to ostatní ignorovat. Umím si v hlavě srovnat, jak je co potřeba udělat a pak to i dokonce i zrealizovat nebo alespoň zařídit. Často vidím věci, které ostatní nevidí. Pravidelně se mi stává, že vidím zřejmé řešení, které ostatní nenapadlo. Samozřejmě to platí i naopak, občas nevidím to, co je jasné ostatním.

Nebojím se udělat rozhodnutí, nejhorší co se může stát je, že bude špatně. Většinou stejně člověk lituje těch rozhodnutí, které udělal jen tak, mimochodem.

Mám zmáknuté agilní metodiky, ale zatímco před deseti lety mi to všechno přišlo snadné, teď už vidím, jak je těžké změnit chování svoje i ostatních, tak aby to nějak v týmu fungovalo.

Pak tak nějak umí i ty věci kolem, jako AWS, Kubernetes, Linux, trochu JavaScriptu s Reaktem, databáze a nevím co ještě, ale spíš jen tak good-enough než nějak skvěle.

Taky mi přijde, že umím věci vysvětlovat, věnovat se mladším kolegům a obecně technické lídršipování.

Slabé stránky

Baví mě programování, nebaví mě většina ostatních věcí. Párkrát jsem jako bokovku dělal Scrum mastera nebo i team leadera, ale nejde mi to a nebaví mě to. Když můžu programovat, tak nemám na ostatní věci chuť a energii. Opravdu si myslím, že mi to programování jde, takže mi přijde škoda dělat věci, které někdo jiný dokáže udělat lépe a nejspíš i levněji. Takže pokud potřebujete někoho, kdo bude lidem schvalovat dovolené a bavit se s nimi o platu, mým směrem se nedívejte.

Dokážu být docela dominantní, což je občas dobře, ale často špatně. Jsou schůze, na kterých dokážu docela dlouho přesvědčivě mluvit, dělat rozhodnutí a tak. Snažím se to omezovat, ale zjistil jsem, že spoustu ostatních programátorů tu potřebu nemá, takže mívám na dominování dost prostoru. Snažím se s tím pracovat.

Občas jsem negativní, když mě věci štvou, tak je to na mě vidět. Občas je to jen upřímnost, když mi něco přijde jako blbost, tak to řeknu. Občas je to ale zbytečná negativita. Snažím se to změnit, ale jde to hrozně ztuha.

Pak taky kladu hloupé otázky. Moje oblíbená je „Jaký problém tím vyřešíme?“. To je vlastnost, kterou neplánuji měnit, ale lidi to občas štve, takže to dávám do kolonky slabých stránek.

Co hledám?

A teď to nejdůležitější, co hledám? Jak plyne z předchozích odstavců, chci programovat v Javě (nebo Kotlinu) na back-endu. Rád předávám své zkušenosti, takže můžu někoho i technicky vést, můžu navrhovat architekturu, navrhovat řešení, ale jen pod podmínkou, že se dostanu i ke kódování.

Rád bych přičichnul k Machine Learningu, mám nějaké základy, ale rád bych si vyzkoušel nějaké uplatnění v praxi. Nicméně ML je něco, co bych se spíš potřeboval naučit než, že bych to dokázal rovnou dělat.

A to nejproblematičtější nakonec, rád bych dělal něco užitečného. Co to je? Úplně nejradši bych se podílel na řešení klimatické katastrofy, do které se řítíme, ale chápu, že takové projekty nejspíš zatím v Čechách nejsou. Takže se spokojím i s děláním něčeho, co někomu alespoň trochu zlepší život. Do Liftaga mě třeba nalákali na to, že se snaží z města dostat zbytečná osobní auta.

Asi jsem v tomhle idealista, ale přijde mi zbytečné budovat další banku, další nástroj na posílání spamu, zobrazování reklamy, další skvělou mobilní hru na výměnu virtuálních kartiček nebo něco co už tu dávno je, ale tentokrát na blockchainu. Rád bych jednoduše dělal něco, co je užitečné.

Takže pokud byste věděli o práci, na kterou bych se mohl hodit, napište mi prosím na lukas@krecan.net.

Jak poznáme, že to je hotové?

Zeptal se mistr žáka: „Jak poznáš, že je tvoje práce hotová?”
„Když skončí vývoj”, odvětil žák. Mistr ho praští holí.

Další den se mistr zeptal na to samé.
„Když je to otestované“, odvětí žák a dostane další ránu.

Mistr se ptá potřetí a žák odpovídá „Už vím, když je to nasazené na produkci!“ Mistr jen smutně zavrtí hlavou.

Čtvrtého dne přijde žák za mistrem sám a říká: „Moje práce je hotová, když je vyřešen daný problém.“ Mistr se usměje a zeptá se: „A jak to poznáš?“

Ano, naše práce není hotová, když nám odpadne kód od ruky, ani když už je otestovaný, dokonce ani když je nasazený na produkci. Naše práce je hotová, až když jsme vyřešili problém, který je potřeba vyřešit. Ale jak to poznáme?

Na to potřebujeme metriku neboli kritérium úspěchu. Nějaké číslo na které se podíváme a poznáme, jestli problém stále máme nebo jestli jsme ho už vyřešili.

Tato metrika by měla splňovat dvě kritéria, která jdou trochu proti sobě. Měla by být co nejblíž businessu a zároveň co nejblíž změně, kterou jsme udělali. V ideálním případě bychom měli udělat změnu a poznat, kolik nám zrovna ta změna přinesla peněz. To většinou bohužel nejde, takže hledáme něco mezi.

Upravujeme registrační formulář, protože teď na něm odpadne 50% potencionálních zákazníků? Můžeme si říci, že to snížíme na 25%. To je pěkná metrika, která se dá přibližně převést na peníze a zároveň drží naší pozornost u registračního formuláře.

Máme pocit, že část naší aplikace je nepřehledná? Jak to měřit? Hledání metriky není vůbec jednoduché, ale i samotné hledání je nesmírně užitečné. Donutí nás to pochopit, co vlastně řešíme. Proč konkrétně nám vadí, že je aplikace nepřehledná? Vadí nám, že zákazníci nedokončí objednávku? Pojďme měřit to. Vadí nám, že zahlcují podporu? Pojďme počítat čas, který tím podpora stráví. Vadí nám, že lidi nechtějí naši aplikaci používat? I to se dá měřit. Tím, že si definuji metriku se donutím myslet na to proč ten problém vlastně řeším.

Musím zdůraznit to, že metrika by měla mít business smysl. Máme občas nutkání měřit jenom přidanou věc. Pro jednoduchost si představme, že přidáváme nové tlačítko. Můžeme měřit kolik lidí na něj kliklo? Můžeme, ale moc nám to neřekne. Tlačítko jsme tam přidávali z nějakého důvodu. Řešili jsme nějaký problém, kterým pravděpodobně nebylo chybějící tlačítko, ale něco úplně jiného. To že změříme, že lidi na tlačítko klikají neznamená, že to pomohlo s řešením problému. Co když na něj klikají omylem?

Vždycky říkám, že programátoři jsou placeni za to, že dodávají hodnotu. Metrika přesouvá moji pozornost z featury na hodnotu.

Když mám metriku, tak ji využiji v celém vývojovém procesu. Nevím který požadavek je důležitější? Ten, který má větší šanci metriku přesunout správným směrem. Cpe mi někdo něco do backlogu pod záminkou řešení aktuální priority? Zeptám se, jestli to opravdu s danou metrikou pomůže.

Největší přínos metriky je ale na konci vývojového procesu. Zabraňuje nám stát se feature factory (tenhle článek si určitě přečtěte). Často totiž tvrdíme, jak jsme agilní a děláme věci iterativně, ale když něco dodáme, tak se k tomu nevracíme. Bez metriky nemáme důvod. Když máme za úkol předělat registrační formulář a nemáme k tomu metriku, tak ho předěláme, oddemujeme nasadíme, přesuneme lísteček a hotovo, hurá na další featuru. Dodali jsme nějakou hodnotu? Koho to zajímá, vždyť to stejně neumíme poznat.

Když máme za úkol zvýšit procento lidí, kteří se skrz registraci dostanou, tak nás to nutí se podívat na to jestli se to povedlo a pokud ne, tak co je další krok. Metrika nás tlačí do toho dělat věci opravdu iterativně, ne jen si na to hrát.