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.

Jaké potřebuji zadání

V poslední době často řeším, jaké bych chtěl dostávat zadání. Došel jsem k tomu, že správné zadání má mít právě tyto dvě části:

  1. Popis problému, který potřebujeme vyřešit.
  2. Business metrika, kterou změříme, že se to povedlo.

Zní to jednoduše, ale nám se to ne a ne podařit. Pojďme se na to podívat postupně. Místo popisu problému stále dostáváme řešení. Místo „zákazník netuší, co má udělat na registračním formuláři“ dostáváme „tlačítko ‘Odeslat’ zvýrazněte červenou barvou“. Místo „potřebujeme ušetřit výdaje na ministerstvech“ dostáváme „postavte vládní čtvrť v Letňanech“.

I když se mi zdá rozdíl mezi popisem problému a řešením zjevný, lidi z nějakého důvodu prostě nejsou schopni se u popisu problému udržet a stále sklouzávají k řešení. Než se podíváme na důvody, proč to tak bývá, řekněme si, proč nechci přicházet k hotovému řešení.

Když dostanu připravené řešení, tak s ním často nesouhlasím. Často totiž nedává technicky nebo dokonce logicky smysl. Napadl mě následují příklad, představte si, že navrhujete auta a přijde vám požadavek – do okna spolujezdce vyrobte uzavíratelný otvor o průměru 18,7 cm.

Pokud se vám něco podobného stane, máte v podstatě jenom dvě špatné možnosti. Můžete to řešení napadnout a říci, že je potřeba vymyslet jiné. Nebo můžete sklapnout podpatky, udělat to podle zadaného řešení i když nechápete proč to děláte a technicky vám to nedává smysl.

Změna zadaného řešení je často hrozně politicky složitá, spoustu lidí na něm strávilo spoustu času, dohodlo se na tom několik vrstev managementu, už se to slíbilo zákazníkovi a teď nějaký hloupý programátor přijde s tím, že by to dělal jinak? Proč se sakra ptáš, na to jaký problém tím chceme vyřešit? Prostě udělej v okně spolujezdce otvor o průměru 18,7 cm a přestaň klást hloupé otázky. Víš kolik času jsme strávili rozhodováním, jaký má být poloměr té díry? Že to nejde? Tvoje práce je tyto drobné technické detaily řešit.

Pokud najdeme odhodlání navrhované řešení zpochybnit, potřebujeme nejdřív zjistit popis problému. Proč by chtěli mít díru v okénku? Naštěstí se můžeme někoho zeptat. „Proč chtějí díru v okně spolujezdce?“ „No, náš důležitý zákazník chce vozit dlouhé tyče, do auta se jim nevejdou, tak je chtějí držet rukou podél auto venku z okénka. Ale když mají otevřené okénko, tak jim dovnitř fouká.“ (XY problem) V těchto okamžicích si vzpomenu na strýčka Boba, který říká, že profesionál se pozná podle toho, že umí říci zákazníkovi „ne“. Takže profesionálně řeknu „ne“ a jsem označen za negativního. Nicméně je to pro mě lepší než druhá alternativa, udělat něco, co nedává smysl.

Abych to shrnul, pokud mě stavíte k hotovému řešení, nutíte mě buď vám to řešení rozbít nebo udělat něco, co firmě dříve nebo později uškodí. U díry v okénku se ty škody dají celkem slušně vysvětlit, dopad kupení hacků na hacky v složitém programu se vysvětluje podstatně hůř.

Tady arogantně předpokládám, že řešení, které přijde od neprogramátora musí být špatně. Často špatně je a to ze dvou jednoduchých důvodů. Programátoři často bývají jediní, koho napadne se ptát, co se bude dít v okrajových případech. Co se stane, když vypadne připojení v internetu v tomto okamžiku. Jak napravíme data, když operátor do toto políčka napíše špatné číslo. Co budeme dělat, když se k tomuto odkazu dostane zlý hacker. Co se stane, když držíte rukou tyč venku z okna a nabouráte? Programátoři se na takovéto otázky ptají, protože musí, potřebují to pro svoji práci. Pamatuji jen pár neprogramátorů, kteří měli podobné uspořádání mysli.

Druhý důvod souvisí. Software je celkem složitá věc, chování nejen v okrajových případech bývá komplikované a nikdo nemá šanci si zapamatovat, jak se vlastně ta vaše aplikace chová za všech okolností. To je ale informace, kterou nutně potřebujete vědět, když vymýšlíte změny. Programátor se může podívat do kódu, kde to v lepším případě zjistí. Lidi, kteří neumí číst kód nemají šanci se těmto důležitým informacím dostat.

Nicméně předpokládejme na chvíli, že máte super analytika, který všechno tajemná zákoutí vaší aplikace udrží v hlavě nebo v dokumentaci a donese vám perfektní řešení. I tak je to špatně. Když neznám problém, který řeším, tak pracuji naslepo, nevím proč dělám to dělám, měním se v robota (nebo lumíka) Když hádám, který problém řeším, můžu to uhodnout špatně a tím pádem to naimplementovat špatně. Když nechápu proč chtějí díru v okénku, tak ji pravděpodobně udělám na špatném místě, takže skrz ní ruka ani prostrčit nepůjde.

Nevýhod hotových řešení je víc, nezbývá mi tu na ně ale místo, takže si je doplňte za domácí úkol. Pojďme se teď radši zamyslet, proč je tak těžké se udržet u popisu problému.

Tichá pošta

U nás se to děje především kvůli tiché poště. Obchodník řeší se zákazníkem jeho problém. Zákazník už má samozřejmě v hlavě nějaké řešení. Obchodník si pak sedne s produktového manažerem, kde si buď řešení potvrdí nebo vymyslí lepší. Proberou to se zákazníkem, ten jim to schválí, vytesá se to do kamene a teď už jen zbývá to naimplementovat.

Tento scénář má mnoho variací, místo zákazníka může být management, místo produktového manažera analytik, místo tesání do kamene je obvyklejší grafický návrh, ale všechny ty scénáře mají jedno společné. K lidem, kteří to budou dělat a kteří celému systému obvykle rozumí nejvíc, se to dostane až když je to celé vymyšlené.

Řešení hledá problém

Abych se netrefoval jen do cizích řad, tohle se děje často vývojářům. Máme v hlavě řešení, ale nemáme k němu problém. Nemusí to být zrovna vládní čtvrť, může to být nejnovější knihovna nebo jiný hype. Pokud jste někdy ve vaší firmě slyšeli „musíme najít něco, na co bychom použili strojové učení“ tak víte o čem mluvím. U nás to většinou skončí tím, že zkusíme napsat popis problému, který bychom strojovým učením mohli vyřešit. Poté většinou zjistíme, že se daný problém dá řešit lépe nebo že ten problém vlastně nemáme.

Vymýšlení řešení je přirozené

No a to nejtěžší na konec. Lidská mysl je stoj na řešení problémů. Je tak tak dokonalá, že když žádný problém nemá, tak problémy vymýšlí, aby měla co řešit. Je hrozně těžké se udržet u popisu problému. Je těžké říci „můj problém je takový a takový“, je pro nás přirozenější říci „chci to a to“. Je těžké říci „nerozumím tomuto formuláři“, říkáme „měli byste prohodit tato dvě políčka“. Každý chce přispět svým nápadem, takže se udržet u popisu problému je opravdu náročné i když lidi přesvědčíme, že je to nezbytné.

Zkuste si následující hru, podívejte se do vašeho backlogu a spočítejte kolik je tam lístečků s popisem problému a kolik čistě s popisem řešení. U těch popisů řešení zkuste zformulovat popis problému. U kolika z nich to dokážete u kolika z nich si nejste jisti? U těch, u kterých to dokážete, zkuste narychlo vymyslet alternativní řešení. Kolik z nich bude lepších, jednodušších, levnějších?

Příště se podíváme na druhý bod, business metriku, kterou to všechno změříme.