Quantcast
Channel: SoftWare Samuraj
Viewing all 81 articles
Browse latest View live

Gradle tutorial: tasky (pokračování)

$
0
0
V minulém díle Gradle tutorialu jsme si vystřihli rafinované Hello world a řekli jsme si něco o základním stavebním prvku každého build skriptu - Task, to je to, oč tu běží. A ruku na srdce, milý čtenáři, jistě jsi zvědavý, kam nás naše povídání zavede. Protože to zajímavé teprve přijde.

Závislosti mezi tasky

Tasky téměř nikdy nestojí samostatně. To není nic moc překvapivého. Známe to z Antu, známe to z Mavenu, bylo by divný, kdyby to Gradle dělal jinak. Když si například vezmeme klasický Maven build lifecycle, tak vypadá nějak takhle:
  1. zpracuj resources,
  2. zkompiluj třídy,
  3. zpracuj test-resources,
  4. zkompiluj třídy testů,
  5. spusť testy,
  6. vytvoř archiv,
  7. atd.
Tyto jednotlivé úkony (v Mavenu nazývané goals) na sebe logicky navazují a jsou na sobě implicitně závislé. Implicitně znamená, že nemusím závislost jednotlivých tasků (goals) explicitně uvádět - Maven "už to nějak ví", jak si ty tasky má seřadit. Magie? Ne, "někdo" mu to řekl.

Podobné je to i v Gradlu. Některé tasky už mají závislosti definované, většinou je to v rámci nějakého pluginu. Třeba u Java pluginu (o kterém si budeme povídat v příště) vytváří závislosti cyklus, který je velmi podobný tomu Mavenímu. Velkou výhodou Gradlu je, že závislosti mezi tasky se definují velmi jednoduše a navíc nad nimi máme programovou kontrolu.

Závislost tasku se dá definovat buď pomocí property nebo metodydependsOn. Způsob zápisu se může podobat tomu, který známe z Antu, čili přímo při definici tasku:
task first << { task ->
println" Working on the ${task.name} task"
}

task second(dependsOn: first) << { task ->
println" Working on the ${task.name} task"
}
Anebo můžeme využít nespoutanosti Groovy a závislost definovat v podstatě na libovolném místě:
task third << { task ->
println" Working on the ${task.name} task"
}

third.dependsOn second 
Vzhledem k tomu, že zde máme závislost tasků third -> second -> first, výstup by při spuštění tasku third měl vypadat následovně:

Závislost tasků

Zajímovou možností je definovat závislosti tasku dynamicky. Vstupem do metody dependsOn totiž může být closure, jedinou podmínkou je, aby vracela objekt typu Task, nebo kolekci Tasků.
task fourth << { task ->
println" Working on the ${task.name} task"
}

fourth.dependsOn {
tasks.findAll { task -> task.group.equals('sequence') }
}
V uvedeném výpisu je task fourth závislý na všech tascích projektu, které jsou seskupeny pomocí vlastnosti group.

Zdrojový kód na Bitbucketu: 02_TaskDependencies/build.gradle

Přeskočení tasku

Ať už jste agilní vývojáři, kteří milují dynamické prostředí, nebo jste naopak vyznavači petrifikovaného zadání, jedno je jisté - chtěná, či nechtěná, stejně přijde nějaká změna. A tak, jakkoliv je náš pracovní lifecycle vymazlený, bude do něj potřeba zasáhnout. Někdy třeba jen dočasně.

Dynamická práce s tasky může být dost komplexní a vydala by na samostatný článek. My se v rámci tutorialu podíváme na část, která je k dispozici out-of-the-box a sice na způsoby, jak zajistit "nevykonání" naplánovoného tasku.

(Při psaní příkladů pro tuto část jsem měl rozvernou náladu, takže v této sekci bude naším průvodcem jeden z hrdinů mého dětství, klokan Skippy :-)

První ze způsobů, jak přeskočit task, je využití metody onlyIf, pro kterou můžeme definovat predikát. Akce v tasku (a tím pádem i task samotný) jsou vykonány pouze tehdy, pokud je predikát vyhodnocen jako true.
task skippy << {
println'I\'m happy, so I jump!'
}

skippy.onlyIf { project.isHappy == 'true' }
V tomto příkladu je task skippy vykonán pouze tehdy, pokud je projektová property isHappy nastavena na true. Pokud takovou property v build skriptu nemáme definovanou, nevadí - přidáme si ji z příkazové řádky pomocí přepínače -P, např. -PisHappy=true.

Přeskočení tasku pomocí metody onlyIf

Další možnost, jak nevykonat task, nebo jeho část, je vyhodit výjimku StopExecutionException. To způsobí, že je zastaveno vykonávání aktuálního tasku a je spuštěno vykonání toho následujícího. Tato výjimka přeruší pouze daný task, build pokračuje dál.
task exceptionalSkippy << {
if (project.isHappy == 'false') {
thrownewStopExecutionException()
}

println'I\'m happy, so I jump!'
}
Jak je vidět na následujícím výstupu, task exceptionalSkippy nebyl přeškočen (jako v předešlém příkladu), ale byl normálně spuštěn a pak byl někde "uvnitř" přerušen.

Přerušení tasku pomocí StopExecutionException

Třetí možností, jak rozhodnout o vykonání tasku je použití property enabled - task tak můžeme vypnout, nebo zapnout.

V následujícím příkladu máme dva tasky. Task disabledSkippy (který nám řekne, jestli Skippy bude skákat) závisí na tasku skippyMood (který nám oznámí Skippyho náladu). Task skippyMood má možnost vypnout task disabledSkippy.
task skippyMood << {
if (project.isHappy == 'false') {
disabledSkippy.enabled = false

println'I\'m not happy :-('
} else {
println'I\'m happy :-)'
}
}

task disabledSkippy << {
println'I\'m happy, so I jump!'
}

disabledSkippy.dependsOn skippyMood

Přeskočení tasku pomocí property enabled

Zdrojový kód na Bitbucketu: 03_SkipTask/build.gradle

Task rules, dynamické generování tasků

Už jsem párkrát naznačoval cosi o dynamičnosti Gradle, pojďmě se tedy podívat na něco konkrétního. Co kdybychom potřebovali větší množství tasků, které dělají v podstatě to samé, akorát se to "to" liší nějakými parametry. Můžeme takovou potřebu řešit pomocí principů objektového programování, třeba. kompozicí. To může být docela otrava, hlavně správa a přetestovávání takových tasků.

Co si takhle potřebné tasky nechat dynamicky vygenerovat? Právě od toho jsou tady task rules.
def environments = [
'DEV': ['url': 'http://dev:8080'],
'SIT': ['url': 'http://sit:9090'],
'UAT': ['url': 'http://uat:7001']]

tasks.addRule('Pattern: deploy<ENV>') { taskName ->
if (taskName.startsWith('deploy')) {
task(taskName) << {
def env = taskName - 'deploy'

if (environments.containsKey(env)) {
def url = environments[env].url

println"Deploying to ${env} environment, url: ${url}"
} else {
println"Unsupported environment: ${env}"
}
}
}
}

Příklad spuštění jednotlivých task rules

Vzhledem ke své povaze jsou task rules uvedeny v samostatné sekci při výpisu tasků pomocí příkazu gradle tasks:

Výpis pravidel (rules) příkazem gradle tasks

Zdrojový kód na Bitbucketu: 04_TaskRules/build.gradle

Asi v tom bude nějakej háček

Jedním z nejčastějších problémů u tasků, se kterým se můžeme zpočátku setkávat, je záměna konfigurace a definice tasku. Definici tasku už známe - používali jsme ji celou dobu. V rámci definice přidáváme do tasku jednotlivé akce, které jsou pak vykonány během exekutivní fáze. Jen pro připomenutí, akce můžeme do tasku přidat metodami doFirst a doLast a daleko nejčastěji se používá operátor << který je aliasem pro metodu doLast.

Konfigurace tasku slouží... ehm, ke konfiguraci tasku. Podstatné je, že konfigurace je vykonána v jiné fázi buildu. A proběhne pokaždé, i když zrovna daný task nespouštíme. Task lze nakonfigurovat několika způsoby, ten "problematický" má stejnou syntaxi jako definice tasku, pouze je bez << operátoru.
task foo {
// some task configuration here
}
V následujícím výpisu task pitfall prvně "nakonfigurujeme" a následně do něj přidáme akci.
task pitfall { task ->
println"Printed from task ${task.name} configuration."
}

pitfall << { task ->
println"Printed from task ${task.name} execution."
}
Když se podíváme na spuštění tasku pitfall, všimněte si, kdy proběhl "konfigurační" výpis. Ještě před začátkem spuštění tasku (tedy před vykonáním obsažených akcí).

"Vizualizace" konfigurační a exekuční fáze tasku

Druhým častým problémem s tasky bývá následující chyba:
Cannot add task ':exists' as a task with that name already exists.
Což znamená, že se snažíme definovat task, který už je definován někde jinde. Problém bude buď v chybné syntaxi, anebo v praxi daleko častěji, pokud pracujeme s projektem, kde používáme plugin, který task stejného jména již obsahuje. Obdobou téhož je, když si do projektu natáhneme antovské tasky (jeden z budoucích dílů tutorialu) a opět, dané jméno tasku už je použito.

Pokud řešíme druhý případ (duplicitní název/definice tasku), můžeme task explicitně předefinovat. Nemusím zdůrazňovat, že bychom měli vědět co a proč to děláme. Pokud máme buildovací skripty plně v rukou, bude tento problém indikovat chybu v designu buildu. Ovšem v případě, že se potýkáme s nějakým legacy buildem (staré Ant build soubory), může být redefinice tasku nutností.

Task lze předefinovat pomocí property overwrite:
task exists << {
println'primary task definition'
}

task exists(overwrite: true) << {
println'overwritten task definition'
}

Redefinice tasku pomocí property overwrite

Zdrojový kód na Bitbucketu: 05_TaskPitfalls/build.gradle

Zdrojové kódy

Zdrojové kódy k dnešnímu dílu jsou k dispozici na Bitbucketu. Můžete si je tam buď probrouzdat, stáhnout jako ZIP archiv, anebo - pokud jste cool hakeři jako já :-) - naklonovat Mercurialem:
hg clone ssh://hg@bitbucket.org/sw-samuraj/gradle-tutorial

Co nás čeká příště

O tascích by se dalo povídat ještě dlouho. Ale protože jsem příznivcem hesla better is enemy of done, tasky dnešním dílem opouštíme a příště se podíváme, jak Gradle řeší Java vývoj.

Tento článek byl původně publikován na serveru Zdroják.

Související články


Související externí články


Jak se nabírají Javisti na Filipínách

$
0
0
Tak nějak se přihodilo, že poslední tři, čtyři roky dělám permanentně technické pohovory s Java vývojáři. Za tu dobu to byly desítky pohovorů. V nové práci jsem to povýšil na další stupeň, když jsem začal dělat občasné remote interview přes Skype a mohl si tak popovídat třeba s lidmi z Brazílie, nebo Indie.

Minulý měsíc se to posunulo ještě dál. Naše společnost otevírá nové delivery centrum v Manile na Filipínách. Bude to základna naší divize pro asijské projekty. Jedním z primárních kroků je vytvořit core team - technical lead, Java vývojář, C# vývojár, integrátor a validator (tester) - který bude schopný autonomně fungovat a eventuálně se postupně rozrůstat.

Že dělám Java pohovory se o mně (minimálně interně) ví, takže jsem dostal nabídku podílet se na výběru lidí pro nový core team.

Místo činu

Pokud jste, tak jako já, neabsolvovali zeměpis v 80tých letech (do dneška si pamatuju skoro všechny hlavní města světa), možná vám přijde vhod pár informací pro navození prostředí.

Filipíny jsou lidnatá země (98 mil. obyv.), s Českem má bezvízový styk, uředními jazyky jsou Filipínština a Angličtina. Hlavním městem je Manila, která je jedním ze 16 cities, které tvoří metropolitní oblast Metro Manila (12 mil. obyv.). Každá pořádná metropole má svůj business district - v případě Manily je to Makati City, kde se také nachází pobočka naší firmy.

Panorama Makati City (zdroj Wikipedia)

Makati je celkem bezpečný region, kde se nemusíte, jako Evropan, bát chodit po ulicích. Nevím, nakolik je to pravda, ale byl jsem místními opakovaně varován, ať si dávám pozor (nebrat si taxíka na letišti, nenosit telefon v ruce, neustále sledovat svoje věci). Plus určitých věcí si člověk všimne sám: taxikář ihned po vašem nastoupení zamkne dveře, časté kontroly zavazadel v budovách, strážní se samopaly v mrakodrapech. A v den, kdy jsem odlétal, zastřelili na letišti starostu jednoho z filipínských měst. Zkrátka trochu jiný svět, než na který jsem zvyklý.

Pár nezávazných generalizací

Strávil jsem v Makati jeden týden a byl to můj první výlet mimo Evropu, takže by bylo pošetilé z toho vyvozovat nějaké obecné závěry. Spíš to berte jako něco, s čím se můžete setkat, pokud budete v podobné situaci. Takže...

Úroveň kandidátů je o řád nižší než v Praze. Když v Manile někdo řekne, že je senior (a třeba i má odpovídající léta praxe), bude to z našeho pohledu spíš junior. A to co se týče znalostí, zkušeností a bohužel i možností (viz dále). Setkal jsem se třeba s relativně seniorním člověkem, který rutinně psal unit testy, ale bez jediného assertu!?! Prostě to, že produkční kód provolám, je dostatečný test (vážně, on nevěděl, že asserty existují a byl vděčný, že se na pohovoru něco naučil).

Asie je továrna na code monkeys. Slyšeli jste někdy, že by programátoři dělali na směny? Tak na Filipínách je to běžná praxe. Jeden z nejčastějších důvodů pro změnu zaměstnání je, že nechtějí dělat noční směny. Velice často pracují u firem zvučných jmen (Accenture, Oracle, IBM, Logica/CGI), ale pouze jako offshorepotrava pro děla. Analýza a QA jsou téměř vždy dělány onshore (z pohledu Filipínců distribuovaně, vzdáleně) a vývojáři dělají jenom mechanickou implementaci tasků, často bez porozumnění principům a souvislostem.

Holky jsou daleko schopnější, než kluci. Sám pro sebe jsem si to nazval "Asian Girl Power". Přiznám se, mám (pracovní ;-) slabost pro holky programátorky. Jsou zodpovědné, pečlivé, cílevědomé, odvádějí velmi dobrou práci (true story). Přesně takhle na mne zapůsobila většina kandidátek na pohovorech. Navíc, oproti českému IT, na Filipínách je běžné, že se holky věnují počítačům - poměr pohlaví na pohovorech byl lehce nakloněn k mužským účastníkům, ale ne nijak výrazně.

School  matters. Když dělám pohovory v Česku, tak zcela ignoruju, jakou má kandidát školu. Kolikrát ani neregistruju, jestli vůbec má univerzitní vzdělání. Prostě české zglajchšaltované školství. Ne tak na Filipínách, kde je situace dost podobná anglosaskému modelu. Pokud jste absolvent University of the Philippines (UP), patříte do extra ligy. Ještě ucházející je Polytechnic University of the Philippines (PUP). A pak už je to jedno. Hodně taky záleží na studovaném programu - pokud místo Computer Engineeringu studujete Electronics Communications Engineering, budete na tom, jako vývojář, dost špatně (co se týká znalostí, teorie a vyhlídek).

Zajímavé také bylo, že všichni kandidáti, bez výjimky, měli bakalářský titul. Žádný magistr, nikdo bez univerzitního vzdělání. Většinou je to tak, že po dodělání bakaláře jdou hned pracovat a školu si pak už nedodělávají.

Všichni Javisti dělají v Eclipse. No comment. (bez ironie ;-)

Místní Silicon Valley je Singapur. Je to tak, pro Jihovýchodní Asii je Singapur houba, která nasává ty schopné a telentované. A pokud je nasaje, už se nechtějí vrátit zpět.

Jídlo je fantastický! Nemusíte být fanoušek asijské kuchyně. Ale ta bohatost a rozmanitost chutí je v Evropě nepředstavitelná. Jeden příklad za všechny - čerstvé mango, oh yeah!! Navíc, filipínská kuchyně je úlně jiná, než thajská, vietnamská, čínská... Pro mne určitě důvod, proč se vracet.

Krab (900 g) v thajské čili omáčce

Jak dělat interview na druhém konci světa?

Cesta na Filipíny trvá letadlem něco mezi 17 a 22 hodinama. Takže si tam nezaletíte jen tak na otočku. Plus je tady časový posun - Filipíny leží v časovém pásmu GMT +8, což znamená dvě věci: jednak budete mít solidní jet lag a jednak se špatně domlouvají remote interview.

Když dělám pohovory v Praze, mám s každým kandidátem phone screen - je to prvotní filtr, jestli vůbec má smysl se s kandidátem vidět osobně. Vzhledem k časovému posunu Filipín jsme tuto možnost zavrhli a vydali se cestou testu. Nemám rád testy. Nesnáším je jako kandidát a nesnáším je jako pohovorující. Nicméně v tomto výjimečném případě jsem je vzal na milost jako přijatelný způsob screeningu.

Na tomto místě bych rád poděkoval svému kolegovi Banterovi, který velkou část testu vytvořil, já jsem do toho jenom tak filozoficko-strategicky kafral. Test je taková směska vytvořená s ohledem na potřebný profil - takže je tam něco z Java language, Java API, Enterprise Javy, SQL, unit testů, UML a Banterův oblíbený FizzBuzz ;-)

Ayala Avenue, Makati
Pokud byste se náhodou chtěli pouštět do podobného testu a chcete, aby měl nějakou vypovídací hodnotu, nezapomeňte si otázky ohodnotit - ne všechny mají stejnou váhu. Taky je dobrý si test na někom nanečisto vyzkoušet, abyste ověřili, že je splnitelný - dal jsem ho kolegovi tady v Praze, seniornímu Javistovi (stihnul to za předpokládanou hodinu, na plný počet bodů).

Výše, v sekci generalizací, jsem psal o nižší úrovni kandidátů. Pro představu, dva nejlepší výsledky z testu byly 17,5 a 16,5 bodu z 24. Průměr byl kolem 10-12 bodů. A výjimečný nebyly ani výsledky se 4 body.

Kandidáti, které jsem viděl na místě, byli profiltrovaný dvěma způsoby - jednak testem a dále už prošli i HR pohovory. Interview byly naplánovány na celý týden, většinou vycházely tak tři na jeden den. Docela záběr.

Agenda pohovorů byla dosti podobná tomu, jak už jsem popisoval v článku Jak dělám Java pohovor. Od té doby jsem to zase o něco vylepšil (o tom někdy příště), ale pro filipínské prostředí jsem to upravil do podoby:
  1. Představení pohovorujících.
  2. Představení naší firmy.
  3. Představení kandidáta.
  4. Technické otázky.
  5. Java workshop.
První tři body, předpokládám, není potřeba vysvětlovat. Co se ale skrývá pod termíny technické otázky a Java workshop?

Technické otázky

Technické otázky začínám nabídkou: "Můžete mi popsat Váš poslední, nebo poslední úspěšný projekt, z technického pohledu?" Je to pozvolný přechod od CV k technickým záležitostem. Co mě zajímá, je:
  • Architektura daného projektu - chci ji namalovat (ideálně na tabuli, nebo aspoň na papír) a popsat. Je zde široké pole pro diskuzi - nad komponentami (technologie), vztahy mezi nimi (protokoly), plusy a mínusy, performance, v jakém kontextu je aplikace vyvíjena atd.
  • Jak vypadal tým a jakým způsobem byl řízen. Sem spadají role v týmu, metodologie a procesy, komunikace v rámci týmu a mimo tým, daily work atd.
  • Jak vypadalo řízení projektu z technického pohledu? Čili opět metodiky a procesy, ale i správa issues a nástroje na podporu (a automatizaci) projektu, release management atd., atd.
Hlavním cílem "projektové" otázky je zjistit, jak je kandidát zakotven v softwarovém inženýrství. Pokud není a říká o sobě, že je senior, má u mne docela vážný problém.

Pak už následují čistě technické otázky, které se odvíjejí od kandidátova CV a praxe. Zpravidla se ptám na věci, které by měl kandidát dobře znát. A naopak - neptám se ho na věci, s nimiž nemá zkušenost, byť je bude v budoucí práci u nás potřebovat. Nejčastěji se otázky točí kolem nějaké komponety, či technologie z oblasti "enterprise" Javy, takže buď něco z Java EE, nebo ze Springu.

Někdy se zeptám na věci, které jsou sice minoritně důležité, ale zaujmou mě (catch my eye) - třeba SoapUI, nebo Selenium. Třeba o tom něco ví. Nebo si to tam dali jen tak pro zajímavost. Tak, nebo tak, zajímá mne, jak se k tomu v odpovědi postaví.

Ať už je otázka jakákoliv, začínám zvolna. "Jaký je hlavní princip za technologií XY? Jak to funguje?" A pak jdeme postupně hloubš a hloubš. Na určité úrovni se pak kandidátovy (nebo moje :-) znalosti zastaví. Což je moje ryska na stupnici kandidátovy seniority. A další otázka podobným způsobem. Většinou jsou takové technologické otázky 2 až 3 a strávíme tím zhruba půl hodiny.

    Java workshop

    Ayala Avenue, Makati
    Ohledně Java workshopu se nebudu moc rozepisovat a odkážu vás na budoucí článek. Obecně jde o to, že s kandidátem strávím cca půl až hodinu programováním a diskuzí nad kódem v IDE.

    Zadáním je UML diagram "určitého abstraktního řešení" (omlouvám se, zatím nebudu konkrétní). Pokud ho kandidát zná, může ho zkusit vysvětlit. Pokud nezná, vysvětlím ho já. Pak otevřu notebook a to co je na diagramu může kandidát vidět jako kostru projektu v IDE.

    Kandidát by měl řešení naimplementovat a napsat k němu unit testy. To, jak kandidát píše kód a jak dobře ovládá IDE je podstatné a zajímavé. Ale daleko důležitější je, jak se mnou komunikuje. Zadání je totiž dosti vágní a tak záleží na kandidátovi, na co se zeptá, s jakým přijden nápadem apod. Jak reaguje na otázky, které průběžně pokládám.

    Celá seance by měla ideálně připomínat párové programování, nebo code review. Mým cílem je, aby kandidát nebyl ve stresu a v nejlepším případě si to i užil. Ne vždy se to podaří. Ale to je v pořádku, protože to co hledám, není jen technické ohodnocení.

    Minimálně stejně důležitý je i cultural fit. Takže pokud někdo nepíše testy, neumí diskutavat nad designem a neumí zdůvodnit své rozhodnutí/implentaci, vidím to jako závažný problém. Stejně tak, pokud někdo dělá pět let v nějaké IDE a neumí ho adekvátně ovládat (fakt se najdou senioři, kteří neznají Ctrl+Space).

    (Více o Java workshopu napíšu ve slibovaném článku, kde bych se chtěl podívat na to, proč si myslím, že je to dobrý způsob, jak si otestovat kandidáta.)

    Po interview

    Tak a máme po interview. Možná měl kandidát ještě nějaké otázky, pár zdvořilostí na závěr a hotovo! Ne tak docela. Je potřeba si kandidáta ohodnotit, možná udělat předběžné rozhodnutí. Pokud je víc intreview v řadě, je dobré si kandidátovo hodnocení nějak "znormalizovat" a zadasadit do relativního kontextu k ostatním - pokud nabírám (i průběžně) více lidí na stejnou pozici, stačí mi, že kandidát překročí určitou laťku. Pokud ale obsazuji jednu pozici z více kandidátů, je dobré mít možnost nějak si je porovnat.

    Já jsem si na Filipínách udělal jednoduchou tabulku:


    To je, čistě za mne, hodnocení technického pohovoru. Což je, samozřejmě, pouze část přijímacího a rozhodovacího procesu. Je to podklad, který společně s mými poznámkami na CV používám pro diskuzi a argumenaci s ostatním členy pohovorujícího týmu.

    A jak to dopadlo?

    Možná čekáte, že vám teď řeknu, kolik kanditátů jsme přijali, jaký je jejich profil atd. Neřeknu. Jednak, tenhle článek není o tom, jak se staví core team, ale jak vypadá interview v mém pojetí. A pak, najmout lidi do týmu není otázka jednoho týdne pohovorů - je tam spousta dalších aspektů a i časově je to daleko náročnější.

    Nicméně, pokud by vás takové téma zajímalo, můžu vás navndadit na jeden z budoucích článků, který bude o tom, jak se (v Česku) staví tým vývojářů. Zůstaňte na příjmu!

    Jeepney, tradiční veřejná doprava na Filipínách

    Související články

    Certifikace Java EE 6 JPA Developer

    $
    0
    0
    Sbírám certifikace a navlíkám je na nit, jako korálky. Už je jich pěkná šňůra. Tak nějak mě to i baví. A člověk si přitom přečte spoustu zajímavých knížek. Tuhle jsem si zase říkal, co mi tak ještě chybí ve sbírce? Ahá! Oracle Certified Expert, Java EE 6 Java Persistence API Developer, to bude něco pro mne.

    Trocha historie

    JPA vychází historicky z Entity Bean, které byly původně součástí EJB specifikace. V Java EE 5 byla sice už definovaná první verze JPA, která ale pořád tak nějak zůstávala součástí EJB. V aktuální verzi Java EE 6 už jsou EJB 3.1 a JPA 2.0 dvě samostatné technologie (byť stále úzce kooperující).

    Tomuto vývoji odpovídají i certifikace: pro Java EE 5 byla k dispozici pouze certifikace Business Component Developer, která obsahovala jak EJB 3.0, tak JPA 1.0. Pro Java EE 6 už jsou to dvě oddělené větve - Enterprise JavaBeans Developer a Java Persistence API Developer.

    A právě tu posledně jmenovanou certifikaci jsem čerstvě absolvoval (jak říkám, sbírám to jak houby :-)  tak bych se rád podělil o své studijní úsilí. Ještě než se k tomu dostanu, předestřu pár informací o certifikaci samotné.

    Certifikace v kostce

    Jako u všech certifikací téhle úrovně, jedná se o test na počítači v nějakém testovacím středisku. Pokud vás zajímají věci jako cena, trvání, passing score, nebo detailnější rozpis témat, můžete se podívat na stránku zkoušky. Já bych uvedl jen hrubší přehled témat:
    • Configure and package JPA Entity classes in enterprise modules
    • Create basic JPA Entity classes
    • Design a Java application that uses a RDMS
    • Ensure data integrity by using Transactions and Locking
    • Java Persistence Criteria API
    • Java Persistence Query Language
    • Optimize database access
    • Use JPA relationships
    • Use advanced JPA features
    • Utilize Entity classes by creating code that uses the EntityManager API

    Ne všechny témata jsou zastoupena rovnoměrně - tak nějak subjektivně mi přijde, že velký důraz se kladl na věci jako:

    Naopak v minimální míře jsem zaznamenal témata jako základní mapování a Java Persistence Query Language (JPQL).

    Co studovat

    Kniha Pro JPA 2

    Když jdu do certifikace, začínám knihou. Nic lepšího se mi neosvědčilo. V případě JPA 2.0 existuje bezkonkurenční bible Pro JPA 2. Knížka je sice z roku 2009, ale to (výjimečně) vůbec nevadí - pokud vám jde o verzi 2.0, ještě s ní pár let vydržíte. Přece jenom, specifikace tak rychle nestárnou.

    (Nicméně pokud netrpělivě vyhlížíte Java EE 7, jejíž součástí bude JPA 2.1, tak už vyšla second edition téhle knihy.)

    Podtitul tohohle "špalku" je Masterinig Java Persistence API a titul nelže - provede vás všemi zákoutími JPA a byť z vás neudělá mistra (to bez praxe jaksi nepůjde), poměrně významně pozvedne úroveň vašich znalostí.

    Kniha je velmi dobře napsaná, má promyšlený koncept a jednotlivá témata a kapitoly na sebe logicky a plynule navazují. Může po ní sáhnout jak úplný (JPA) začátečník, tak někdo kde přechází z předešlé verze 1.0 a stejně tak, pokud si jen potřebujete oživit některé oblasti. A dá s použít i jako prvotní reference (pokud nepotřebujete jít příliš do hloubky). Tak všestranná kvalitní kniha se jen tak nevidí. A je to ideální zdroj pro přípravu na certifikaci.

    Aby byla tahle kniha briliantová, chybí jí jen jeden aspekt - propojení JPA se Springem. Je pochopitelné, že je JPA provázáno s EJB, poněvadž obojí je součástí Java EE. Na druhou stranu, kombinace Spring + Hibernate táhla v uplynulých letech vítězně světem a to tak masivně, že bych čekal, že to nelze opominout. Lze. Takže ve výsledku je kniha jen diamantová :-)

    Kniha Java Persistence with Hibernate

    Když to jde, tj. je čas a je to vůbec k dispozici, snažím se, pro přípravu na certifikaci, přečíst knihy dvě. V tomto případě byl mojí sekundární volbou opus Java Persistence with Hibernate, na kterém mě lákaly dvě věci - jednak je od Manningu, jehož počiny mě, když ne nadchnou, tak aspoň nezklamou; a jednak je jedním z autorů Gavin King, stvořitel zmiňovaného Hibernate. Plus navíc je tahle kniha žhavě aktuální - ještě stále je ve stavu early access (MEAP) a finální by měla být letos v březnu.

    Na tuhle knihu jsem se hodně těšil, ale mám z ní rozporuplný pocit. Předně, je hrozně ukecaná. Ale hrozně. Než se autoři k něčemu podstatnému dostanou, tak to trvá a vysvětlí vám to fakt pořádně.

    Pak mi tady chybí, to co se mi tak líbilo na předešlé knize - propracovaný koncept. Přijde mi, že byť autoři směřují k určitému cíli, plují proti větru a křižují perzistentní vody sem a tam. S tím souvisí i další věc: tuhle knihu určitě nepoužijete jako referenci - jakékoliv téma se v ní bude obtížně hledat.

    Co je naopak na tomto počinu cenné, je popis vlastností, které má Hibernate nad rámec JPA. Hibernate je totiž jeho implementací:
    • Hibernate 3.2 implementoval JPA 1.0
    • Hibernate 3.5 implementoval JPA 2.0
    • Hibernate 4.3 implementuje JPA 2.1

    Protože Hibernate je starší a zralejší technologií, než JPA, tak nijak nepřekvapí, že je i bohatší na různé vlastnosti a je v lecčems napřed. A právě tyhle aspekty (kromě samotného JPA), kniha popisuje. Za všechny bych zmínil třeba možnost definovat anotace platné pro celou persistence unit (třeba @NamedQuery) na tříde package-info.java, což JPA neumí.

    Celkovému hodnocení téhle knihy bych se prozatím vyhnul. Ovšem čistě z pohledu certifikace to není moc dobrý zdroj - je příliš rozvláčný, ne vhodně strukturovaný a nejspíš (z hlediska JPA) ani kompletní. Nicméně pro rozšíření kontextu to rozhodně není špatné.

    Training tests

    Pokud má někdo hodně dobrou paměť, orientovanou na detaily a přesné znění, možná může jít do certifikace jen po načtení literatury. To není můj případ. Většinou si po čase pamatuju cosi ve stylu něco takového tam je, ale přesně si to už nepamatuju.

    Takže vždy tak maximálně 14 dní před zkouškou a poslední dobou spíš už jen týden, používám nějakou sadu zkušebních testů, které mi pomohou se "naladit" na ostrý test. Pro JPA jsem dal na doporučení na JavaRanch a si vybral sadu od Enthuware.

    Jedná se o sadu čtyř testů, které rozsahem odpovídají certifikaci (tj. 64 otázek, 135 minut). Testy jsou o něco težší, než ten reálný. Po vyhodnocení testu se dají otázky znovu projít, tentokrát s vysvětlením, které je sice dost úsporné, ale pokud jste se předtím neflákali, mělo by to být dostačující. A cena $20 není špatná.

    Co mě to přineslo?

    Jedním z hlavních přinosů certifikací pro mne vždycky bylo prohloubení znalostí. V případě JPA jsem:
    • upgradoval z verze 1.0 na 2.0,
    • naučil se pořádně Criteria API,
    • přeorientoval se z cachování poskytovaném providerem k tomu definovanému ve specifikaci,
    • oživil si věci, které se v nové verzi JPA "až tak neměnily"
    • a přečetl dvě dobré knihy.

    To vůbec není špatné. Já jsem spokojený :-)

    Související články

    Kanban, lehký úvod

    $
    0
    0
    Rok se sešel s rokem (skoro), takže je nejvyšší čas, říct si zase něco o Kanbanu :-)  Přiznám se, v těch minulých článcích jsem to trochu flákal, moc se mi nechtělo do popisu, co to vlastně Kanban je. Tak to napravím.

    Co je to Kanban?

    Když mám definovat Kanban jednou větou, obvykle říkám: Kanban je metoda-nástroj na zefektivnění procesu. Kdybych měl přidat druhou: Kanban lze aplikovat na libovolný proces - je jedno, jestli jde o Scrum, nebo vodopád. A konečně: Ten proces už musí existovat - Kanban neříká nic o tom, jak vyvíjet software.

    Abych pravdu řekl, nikdy jsem nepřemýšlel na tím, jestli je Kanban využitelný i mimo oblast softwarového vývoje - jestli ano, tak mě to asi ani moc nezajímá. Jestliže kdekoliv dál v článku mluvím o procesech, mám na mysli procesy, jejichž smyslem je vytvoření, výroba, doručení software.

    Abych vás neochudil o plnokrevnou definici, tak Wikipedia říká:

    "Kanban is a method for managing knowledge work with an emphasis on just-in-time delivery while not overloading the team members. In this approach, the process, from definition of a task to its delivery to the customer, is displayed for participants to see and developers pull work from a queue."

    A abych vás obohatil ještě o trochu víc, tak David J. Anderson (jeden z duchovních otců Kanbanu a autor jeho bible) praví:

    "In software development, we are using a virtual kanban system to limit (team's) work-in-progress ... to a set capacity and to balance the demand on the team against the throughput of their delivered work. By doing this we can achieve a sustainable pace of development so that all individuals can achieve a work versus personal life balance."

    Co Kanban (určitě) není?

    Lidé mají velmi často pomýlené představy, co to Kanban je. Pojdmě si ho proto definovat i negativně:
    • Kanban není metodologie. Často se setkávám se snahou srovnávat Kanban a Scrum. To je nesmyslná snaha. Kanban neříká vůbec nic o tom, jak máte dělat software. Neříká nic o tom, jak dělat (a jak často) plánování, nebo releasování. Neříká vůbec nic o tom, kdy máte co(koliv) udělat. Neobsahuje žádné ceremonie (denní meetingy, review, statusy projektu atd.). Chcete-li dělat vývoj software metodicky, najděte si nějakou metodiku, Kanban vám v tom nijak nepomůže.
    • Kanban není proces. Pokud děláte software, musíte mít nějaký proces - můžete ho mít definovaný explicitně (třeba pomocí nějaké metodiky), nebo implicitně (což může v lepším případě znamenat intuitivně, nebo v tom horším chaoticky). Každopádně, pokud chcete používat Kanban, musíte už takový proces mít. Kanban se totiž vždy aplikuje na proces, je to taková "poleva".
    • Kanban není agilní praktika. Kanban bývá často zmiňován ve společnosti agilního vývoje. Což je daný tím, že on se s agilními metodikami velmi dobře pojí, velmi dobře je doplňuje. Ale Kanban stejně tak dobře můžeme aplikovat na krystalicky čistý vodopád, či libovolný jiný "rigidní" způsob vývoje.
    • Kanban není nástroj na project management. Pokud jste projekťák, může vám Kanban pomoci - asi největším přínosem pro vás bude předvídatelnost procesu a dodávek. Ale nijak vám nepomůže projekt řídit. Neřekne vám nic o potřebných zdrojích, o termínech, nijak nezohledňuje rozpočet projektu atd. Platí to samé jako u procesů a metodik - Kanban vám neřekne "jak to máte dělat".
    • Kanban není všelék (stříbrná kulka). Kanban může některé vaše problémy vyřešit. Ale jenom některé. Lidé jsou nepoučitelní a tak se pořád najdou tací, kteří čekají na zázrak, který nepřichází. Kanban je dostatečně nový (a neznámý), aby sváděl některé manažery a "decision makery" k nereálným očekáváním. Je to ohraná písnička, ale... ani tentokrát mesiáš nepřijde.

    Jaké přináší benefity?

    V předešlé sekci jsem popsal, co Kanban není, což může na někoho působit negativně a vzbudit otázky: je to vůbec k něčemu? Nepomůže nám to ani s metodikou, ani s procesem, ani s project managementem. Proč se tím tedy zabývat?

    V prezentaci na konci článku těch důvodů najdete víc, já bych z nich vypíchnul tři, které považuji za nejdůležitější:
    1. Kanban odstraní z procesu neefektivitu. Tohle je jeho kvintesence. Kanban pojímá práci jako proud, plynutí. Vše, co brání plynulosti procesu se snaži odstranit.
    2. Omezením rozpracované práce se zvýší kvalita. Tím, že se vývojáři (a další role) soustředí (ideálně) pouze na jeden úkol, měla by se zvýšit kvalita jejich výstupů.
    3. Kanban zavádí změny postupně, inkrementálně. Tohle je zajímavé z "politických" důvodů. Jednak směrem nahoru, k managementu, kdy se drobné změny rozložené v čase prosazují snáze a jednak směrem dolů, k lidem, jež jsou/budou denními účastníky procesu - lidé bývají vůči změnám rezistentní a konzervativní, takže opět - drobné změny se spíše skousnou.

    Kořeny Kanbanu

    Prapůvod Kanbanu lze hledat v Toyota Production System (TPS). Součástí TPS je i kanban system - systém pro řízení just-in-time produkce, nicméně (softwarový) Kanban se inspiroval i v jiných aspektech TPS, třeba filozofii kaizen (kontinuální zlepšování), nebo konceptu muda (odpad, neproduktivní činnost).

    TPS je silně inspirativní systém. S ohledem na softwarový vývoj je jednou z jeho prvních adaptací Lean Software Development (LSD) - agilní metodika, která sice není tak populární, jako Scrum, ale třeba pro oblast enterprise určitě vhodnější. Kanban přejímá z LSD některé jeho nástroje, za všechny bych zmínil třeba teorii front.

    Kanban také intenzivně čerpá z teorie omezení - Theory of Constraints (TOC). Jednou z implementací TOC je metodika Drum-Buffer-Rope (DBR), která je přímým předchůdcem Kanbanu.

    5 základních principů

    Kanban je definován pomocí pěti základních (core) principů, které si postupně rozebereme.
    1. Vizualizuj workflow.
    2. Limituj rozdělanou práci.
    3. Měr a spravuj flow.
    4. Udělej procesní politiky explicitní.
    5. Používej modely pro rozpoznání příležitosti ke zlepšení.

    Vizualizuj workflow

    Celý Kanban se hodně točí kolem vizualizace a vizualizace workflow, patří k tomu nejviditelnějšímu, na co můžeme narazit. Tato technika není ničím specifická, už před vznikem Kanbanu ji využívaly ostatní agilní metodiky.

    Fyzický Kanban board

    Princip je jednoduchý:
    • Vezmeme tabuli (Kanban board) a rozdělíme ji na vertikální sloupce (swim-lines) podle jednotlivých stavů našeho workflow (tyto stavy se často kryjí se stavy v issue tracking systému (ITS)).
    • Práci, kterou potřebujeme udělat, rozdělíme na části (nazývané tasky) stejné, či podobné granularity. Tasky jsou prezentovány lístečky/kartičkami.
    • Každý, takto identifikovaný task, umístíme na Kanban board do odpovídající swim-liny.

    Fyzický Kanban board

    Kanban board může mít buď fyzickou, nebo elektronickou podobu. Fyzický board se většinou řeší klasickou bílou tabulí (whiteboard), kam lze lístečky přilepit, připnout magnetem apod. Elektronický board je někdy poskytován ITS (třeba JIRA Agile (dříve GreenHopper plugin)), nebo lze použít samostatný nástroj (zkuste zagooglovat, je jich spousta).

    Je lepší použít fyzický, nebo elektronický Kanban board? Záleží na kontextu. Fyzický se dobře vyjímá v openspacu a dobře se před ním dělají stand-up meetingy. Pozitivní psychologický efekt je, že board je vidět neustále a tak každý člen týmu (i náhodný kolemjdoucí manažer) mají okamžitý přehled o stavu projektu. I z osobní zkušenosti (pokud to jde) doporučuji použít fyzický Kanban board.

    Elektronický Kanban board (JIRA plugin GreenHopper (nyní JIRA Agile))
    Omezením fyzického boardu je jeho, ehm fyzičnost, čili jde použít pouze lokálně. Pokud máte distribuovaný tým, bude elektronický board lepší volba - alespoň jako primární zdroj pravdy. Fyzický board se dá nicméně v této situaci také využít, byť jen jako sekundární nositel informace.

    Další výhodou elektronického boardu je jeho provázanost s ITS. Kanban board pak bývá "pouhým" snapshotem, pohledem na tasky. Tzn. že odpadá duplikování informace a synchronizace v ITS a na fyzickém boardu.

    Elektronický Kanban board (Redmine)

    Limituj rozdělanou práci

    Všichni to ví, všichni to tak nějak tuší, ale Kanban to říká nahlas: nedělejte na více věcech najednou. Vemte si jednu věc, dodělejte ji a vezměte si další. Nepřepínejte kontext!

    Jak říká David J. Anderson v knize Kanban: "As we all know, there really is no such thing as multi-tasking in the office; what we do is frequent task switching".

    Přepínání kontextu nemá žádný pozitivní efekt (snad kromě toho, že udržuje mozek v obrátkách). Kanban se k němu staví negativně a otevřeně říká: nastavte explicitní limit, kolik tasků může být v daném stavu workflow. Tomuto principu se říká omezení Work-in-Progress (WIP).

    Pokud používáme fyzický board, napíšeme limit tasků nad každou swim-line. Kromě maximálního počtu tasků lze nastavit i minimální, tj. pod jaké množství by počet tasků ve flow neměl klesnout. Problém s WIP na fyzickém boardu je zřejmý - jeho dodržování je potřeba kontrolovat manuálně.

    Nastavení WIP na fyzickém boardu
    Výhodou elektronického boardu je, že za vás nastavené WIP hlídá. Buď vám vůbec nedovolí tento limit překročit (prostě task nad limit nejde přesunout do "vyčerpaného" stavu), nebo vás aspoň upozorní, že limit byl překročen.

    Ať už hlídáme WIP libovolným způsobem, podstatné je, jak se zachováme při jeho překročení. Můžou nastat tři modelové situace:
    • Limit WIP máme dobře nastavený. Jeho vyčerpání nám signalizuje bottleneck ve flow. Ten může být buď dočasný, nebo chronický. V prvním případě by se měl zapojit celý tým, aby dočasný, jednorázový problém ostranil. V druhém případě bychom měli zapřemýšlet o změně procesu, flow apod.
    • Limit WIP máme dobře nastavený, ale jeho překročení ignorujeme. V takovém případě je Kanban pouze formální záležitostí a je zbytečné ho dělat. Nebo od něj očekávat nějaké pozitivní výsledky.
    • Limit WIP máme nastavený příliš vysoko, nebo nízko. Kanban je adaptivní, takže WIP upravíme na přiměřenější hodnoty.

    Nastavení WIP na elektronickém boardu (JIRA plugin GreenHopper)
    Kruciální otázkou je, jak správně WIP nastavit. Je to podobné, jako s odhady pracnosti. Pokud můžeme, vezme v potaz podobný proces z minulosti. Pokud nemáme s čím srovnávat, vezmeme "expertní odhad". Nastavit WIP podle pravidla 1 vývojář, 1 task, taky není špatný začátek. Podstatné není, jestli WIP nastavíme správně na začátku. Ale že ho v průběhu projektu přizpůsobujeme podle aktuálního vývoje situace.

    Měř a spravuj flow

    Jedna z věcí, které Kanban převzal z TPS je filozofie kaizen, kontinuální zlepšování procesu. Abychom věděli, že se proces zlepšuje, je potřeba ho měřit.

    Jednou ze stěžejních veličin, kterou Kanban používá (a měří) je lead time - čas, za jak dlouho se task dostane z jednoho stavu do jiného, typicky ze stavu To Do do stavu Done. Ale jeden task nás na projektu nevytrhne - proto Kanban častěji pracuje s kumulovaným lead time, tj. za jak dlouho projde flow průměrný task.

    Pokud pracujeme s lead time, bude nás zajímat, kolik z něj bylo stráveno "produktivní" prací. Protože jeho "neproduktivní"část je to, co Kanban nazývá waste (a TPS muda) a tento "odpad", neproduktivní činnost se snaží (postupně) odstranit.

    Na druhou stranu, ne vždycky musí být lead time, který obsahuje waste, špatnou věcí. Protože to tak může být záměrně. Pokud například máme definovaný stav To Release, ve kterém nám tasky čakají na... release (protože změny nasazujeme hromadně), může být "neproduktivní"čekání tasku v takovémto stavu v pořádku. Nebo taky nemusí, musíme se zamyslet, jestli třeba změna procesu, která umožní kontinuální nasazování tasků nezlepší jak lead time, tak kvalitu celého produktu.

    Cumulative Flow diagram (zdroj Paul Klipp)
    Průběh a vývoj flow se v Kanbanu často zobrazuje pomocí Cumulative Flow diagramu, což je jeden z nástrojů teorie front. Diagram umožňuje rychlý přehled, jestli jsou dodržováný limity WIP, jestli se v průběhu času zlepšuje lead time a taky "plynulost" našeho systému - pokud Kanban "pracuje" správně, měly by být jednotlivé pruhy v diagramu hladké a s konstantní výškou.

    Udělej procesní politiky explicitní

    Podstatou tohoto kroku je přesvědčení, že pokud definujeme na projektu explicitní definice procesních politik a shodneme se na jejich porozumnění; přinese nám to benefit, že budeme schopni racionálně a objektivně diskutovat nad jednotlivými issues a následně zapracovat na jejich zlepšení, nebo mitigování s nimi spojených rizik.

    Příklady takových politik může být:
    • Definition of Done (DoD),
    • Work-in-Progress (WIP),
    • adresování issues,
    • eskalační mechanizmus,
    • zodpovědnost v jednotlivých procesních stavech.

    Konkrétním příkladem takové politiky může být např. zero-bug-policy:

    "Když je na projektu nalezen bug (oproti specifikaci), má automatickou prioritu Critical a musí být přednostně opraven. Tj. nezačínáme nové tasky, dokud nejsou opraveny kritické chyby."

    To, že jsou politiky explicitní nejspíš znamená, že jsou někde sepsány. To ale nestačí - pokud jsou pohřbený někde na SharePointu apod., tak jsou v podstatě bezcenné. Naopak, měly by být jednodušše dostupné. Ideální místo je například wiki, která je součástí Issue Tracking systému.

    Používej modely pro rozpoznání příležitostí ke zlepšení

    Poslední (a nejvíc zanedbávaný) krok v Kanbanu je opět o vizualizaci - používá modely procesů a workflow, na základě kterých pak můžeme zlepšit celkové fungování projektu/procesu. Důvod onoho zanedbávání (já to dělám taky) je prostý, jedná se o dost teoretickou záležitost. Modely, které se běžně používají jsou:

    David J. Anderson k tomu v knize Kanban říká:

    "By modeling the workflow of a software development lifecycle as a value stream and then creating a tracking and visualization system to track state changes of emerging work as it „flowed“ through the system, I could see bottlenecks. The ability to identify a bottleneck is the first step in the underlying model for the Theory of Constraints."

    Prezentace

    Záměr napsat tenhle článek jsem nepojal jen tak z čista jasna. Chystal jsem se na projekt, kde nyní Kanban používáme. A tak, v rámci sdílení znalostí (i pro získání politické podpory) jsem měl o Kanbanu přednášku u nás v práci:



    Zdroje


    Související články:

    Třetí rok s Kindlem

    $
    0
    0
    Tak už jsou tomu tři roky, co jsem si koupil Kindle. Loni jsem psal o vynuceném upgradu z Kindle 3 (Keyboard) na Kindle Touch (ani jeden z nich už Amazon neprodává). Letos mne nic takového bohužel a bohudík nepotkalo.

    Bohudík, protože mám rád, když věci dobře slouží - předposlední telefon (Motorola Razr2) jsem měl 5,5 roku a ještě pořád bych ho mohl povolat ze zálohy. A Kindle Touch se mě drží jako klíště a snáší se mnou dennodenní útrapy. Už jsme starý parťáci, tak spolu ještě vydržíme.

    Bohužel, protože minimálně čtyři vlastnosti aktuálního Kindle Paperwhite se mi moc líbí:
    • je o polovinu lehčí a tenčí než Touch,
    • má vestavěné osvětlení,
    • Vocabulary Builder
    • a napojení na Goodreads.

    Když už jsme u toho Goodreads, zmigroval jsem tam svůj reading-list, takže se můžete porochnit v mých poličkách. A pokud tam náhodou jste taky a trpíte podobnou úchylkou jako já - lunetická potřeba číst a číst a číst, klidně mě kontaktujte.

    Ze ten rok se mi podařilo přečíst 30 knih, taková, řekl bych, všehorodá směska. Následujou ty, které bych označil širokým pojmem "odborné".

    Software Engineering

    • Agile Retrospectives - hodně dobrá kniha o (agilních) retrospektivách. Zaměřuje se převážně na retrospektivu iterace, ale zmiňuje i rozdílný přístup pro release, nebo projekt retrospektivu. Většina knihy obsahuje popis aktivit pro jednotlivé fáze retrospektivy.
    • Good Math - říkal jsem si, že se trochu dovzdělám (a oživím si) v matematice. No, není to špatný, ale moc mě to nenadchlo. Tři hlavní témata jsou čísla, predikátová logika a Turing Machine + Lambda kalkul.
    • The Agile Samurai - vůbec ne špatný úvod do agilních záležitostí, taková směska praktických věcí. Ale opravdu jenom úvod.
    • Kanban for Skeptics - není to špatná knížka, když už víte, co je to Kanban a potřebujete někomu vysvětlit, proč to funguje - systematických argumentů je tu dost. Bohužel se tam nedozvíte nic o tom, co to Kanban je.
    • Pro JPA 2 - bible Java Persistence API 2.0. Použil jsem ji jako podklad pro JPA certifikaci a můžu ji doporučit i jako referenci. Chybí ale jakákoliv zmínka o integraci se Springem. Krátce se o knize zmiňuju v článku Certifikace Java EE 6 JPA Developer.
    • Hibernate Search by Example - pokud potřebujete zároveň použít full-text vyhledávání spolu s ORM, tohle je dobrý zdroj i reference.
    • Mastering Redmine - Redmine je open source issue tracking nástroj, napsaný v Ruby on Rails. Pokud Redmine používáte, nebo spravujete, je tahle kniha tak 12x lepší než oficiální dokumentace (která je mizerná).
    • The Healthy Programmer - tahle kniha vám neprozradí tajemství věčného života. Za to vám ale řekne, jak si vytvořit udržitelný životní styl, který vám umožní dělat programátora ještě za 10 (a víc) let. Napsal jsem o tom blog post Zdravý programátor.
    • Book of Vaadin (Vaadin 7 Edition) - pokud fandíte komponentovým frameworkům v Javě (třeba já jo), je Vaadin dobrou volbou (byť je jeho rozšíření na trhu hodně minoritní). Book of Vaadin je oficiální dokumentací, je zdarma a předčí nejednu komerční knihu k danému tématu (kterých moc není). Jediný, co mi v knize chybí, je integrace Vaadinu na další vrstvy a frameworky (Spring, EJB, CDI).
    • Vaadin 7 Cookbook - jednoznačně nejhorší kniha, kterou jsem loni četl. Nekoncepční, zmatená, s tipy diskutabilní kvality (trošku autory podezírám z absence praxe). Opravdu si v knize za $20 potřebuju přečíst, jak "přinutím" tlačítko, aby se chovalo jako odkaz?!? I když mi knihu koupil zaměstnavatel, byl jsem naštvaný za vyhozený peníze :-(
    • JBoss AS 7 Configuration, Deployment and Administration - výborná kniha o sedmičkovém JBossu. Must have, pokud to s ním myslíte vážně. Kniha je výborně strukturovaná, dobře se čte, má rozumnou úroveň detailu a dozvíte se z ní o věcech, o kterých se moc nemluví, třeba o JBoss CLI, nebo Infinispanu.
    • Log4J - kratičký spisek (74 str.) o Log4J. Mnoha, mnoha vývojářům by prospělo, kdyby si to přečetli (a pochopili ;-)
    • Mercurial: The Definitive Guide - bible Mercurialu. Zdarma. Na můj vkus se trochu moc mluví o MQ (Mercurial Queues) a chybí některá pokročilejší témata (třeba trošku víc o branchování), ale jinak perfektní opus.
    • Gradle Effective Implementation Guide - první a skvělá kniha o Gradlu. Ideální začátek - ačkoliv má Gradle výbornou dokumentaci, pro pochopení kontextu a jak spolu jednotlivé věci fungují, bych doporučil spíš tuhle knihu.


    Kanban for Skeptics
    Pro JPA 2: Mastering the Java™ Persistence API
    Hibernate Search by Example
    Mastering Redmine
    The Healthy Programmer
    Book of Vaadin: Vaadin 7 Edition
    Vaadin 7 Cookbook
    JBoss AS 7 Configuration, Deployment and Administration
    Log4j
    Mercurial: The Definitive Guide
    Gradle Effective Implementation Guide


    Vít Kotačka's favorite books »

    Leadership

    • Start With Why - inspirativní kniha, která trpí repetitivností a zbožňováním Applu. Základní idea je prostá: prvně je potřeba vědět proč něco dělám, z toho vyplyne jak to budu dělat a výsledkem je co budu dělat. Aplikovatelné na všechno, od osobních věcí, po globální společnosti. Inspirativní jsou ti (jednotlivci i společnosti), kdo mají (a začínají u) definovaný proč.
    • The Power of Habit - všichni známe sílu zvyku. Málokdo si ale uvědomuje, jak moc nás zvyky ovlivňují (jednotlivce, společnosti i státy či národy). A pokud chceme něco změnit - u sebe, v týmu, ve společnosti, je potřeba se zvyky počítat. Nebo vytvořit nové a nahradit jimi ty staré.
    • Tha Last Lecture - emocionálně silná výpověď o tom, že dreams come true. (Teda pokud zrovna nemáte rakovinu.) A většinou je za tím cílevědomost a tvrdá práce. Jak říká autor: "I find the best shortcut is the long way, which is basically two words: work hard."
    • Team Geek - nepostradatelná příručka moderního team leadera. Pokud nemáte ponětí, co team leadování obnáší, nebo se to chcete "naučit", tohle je určitě (mnou) doporučená literatura. Psal jsem o téhle knize v článku Team Geek, team leader se srdcem.
    • Steve Jobs: Ten Lessons in Leadership - snůška blábolů a nekritické uctívání Steva, taková mikro hagiografie. Za $3 to rozhodně nestojí a o leadershipu se nedozvíte nic.
    • Scrappy Project Management - knížka o tom, že projekťák "musí mít koule" (platí obrazně i pro ženy ;-)  Jinak je on i váš tým odsouzen k pomalé, bolestivé (a zasloužené) smrti. Doporučené čtení pro všechny, kdo se jakkoliv motají kolem (softwarových) projektů.


    Start with Why: How Great Leaders Inspire Everyone to Take Action
    The Power of Habit: Why We Do What We Do in Life and Business
    The Last Lecture
    Team Geek: A Software Developer's Guide to Working Well with Others
    Steve Jobs: Ten Lessons in Leadership
    Scrappy Project Management: The 12 Predictable and Avoidable Pitfalls Every Project Faces


    Související články

    Cesta samuraje, rok třetí

    $
    0
    0
    Uběhl třetí rok a samurajský meč je stále ostřejší. Jen poslední dobou nějak zahálí. Má smysl brousit měč, když se pak nikdy nepoužije? Někdy je to možná lepší. Ale dost planého filozofování, panta rhei.

    Výpadek psaní

    V uplynulých měsících jsem toho moc nenapsal. Poslední čtyři měsíce loňského roku vůbec nic a za celý letošek jsem se dopracoval ke čtyřem článkům. To je velmi tristní výsledek. Má to svoje důvody a jak to tak bývá, sešlo se jich víc dohromady. Čím to bylo?

    V první řadě, loni v létě jsem začal po čase opět běhat a v zápětí nato jsem se (v období přechodného sebevědomí) přihlásil na Pražský maraton. Do té doby to pro mne byl nepředstavitelný cíl, ale říkal jsem si, že když na tom budu tvrdě pracovat, tak to zvládnu.

    V rámci přípravy jsem naběhal tisíc tréninkových kilometrů, které sice zajistily, že jsem maraton v květnu bez problémů zaběhnul (a užil si to), ale také to ukrojilo pořádný kus mého volného času. Času, ve kterém jsem dříve psal.

    Dalším, byť minoritním, důvodem ne-psaní je Gradle tutorial, který jsem začal loni psát. Chtěl jsem trochu diverzifikovat své čtenáře a tak jsem se domluvil se serverem Zdroják, že bych publikoval primárně u nich a pak teprve u sebe na blogu.

    Měl jsem tehdy vypracovaný pravidelný rytmus tří článků za měsíc, který vyplýval z toho, že jsem pravidelně psal. Bohužel, nepředvídatelnost publikování na Zdrojáku mi tento rytmus rozhodila, což ovlivnilo i pravidelnost psaní - ve výsledku to totiž znamenalo napsat o jeden článek měsíčně navíc. Což jsem chvíli zkoušel, ale nefungovalo to, bylo to zkrátka už moc.

    Posledním důvodem je, že jsem de facto neměl doma k dispozici notebook na psaní. Sdílet v rodiné konstalaci notebook je totéž, jako se prát o ovladač k televizi. A jelikož já svým psaním na blog peníze nevydělávám, bylo o vytížení notebooku rozhodnuto.

    Bylo by hezké říct, že jsem tyto problémy a výzvy vyřešil a nyní budu zase psát jako dřív. Částečně ano, ale co se počítá, jsou hotové, dodělané věci, takže uvidím. Rád bych se dostal do tempa dva články za měsíc, tak mi držte palce.

    Práce

    Hodně článků, které jsem napsal, nějakým způsobem kolidují s mojí prací. A protože třetí rok Software Samuraje se kryje se změnou zaměstnání, rád bych se ohlédl i zde.

    Když jsem před rokem hledal novou práci, chtěl jsem něco, kdy bych mohl skloubit tři věci, které mne baví: team leading, SW architekturu a Java development. Štěstí se na mne usmálo a přesně takovou práci jsem našel. A po roce jsem stále spokojený a moc se těším na ten další. Kdyby vás zajímalo, o co jde, sepsal jsem o tom článek Hledám do svého týmu Java vývojáře, článek je pořád aktuální.

    Z témat bych vypíchnul:

    Team leading: mám dosud nevídaný luxus - můžu si sestavit svůj vlastní vývojářský tým. Už vybírám víc jak rok a zatím jsme na osmi lidech. Už dlouhodobě o tom plánuju sepsat článek, řekl bych, že bude hodně zajímavý :-)

    Jako team leader jsem si vyzkoušel nové věci a zlepšil ty stávající. Třeba mentoring, 1:1 pohovory a retrospektivy.

    Teamová kultura: i tady jsem vyhrál loterii, je to asi nejlepší pracovní prostředí, kde jsem jako vývojář pracoval. A mám skvělého šéfa.

    Hiring: technical recruitment mě baví. A rád bych o tom napsal pár článků. Za ten rok jsem absolvoval desítky pohovorů a je to interesantní materiál.

    Cestování: za poslední půl rok jsem pracovně navštívil tři kontinenty (Evropa, Asie, Afrika) a brzy to bude asi Amerika. Cestování mě baví a je to výborná zkušenost (ne vždy pozitivní ;-)

    Metodiky: nějaké metodiky už u nás máme. A já mám možnost je vylepšovat a zavádět nové. Stal jsem se tak trochu Kanban evangelistou. A to je taky vděčné téma ke psaní.

    Budoucnost

    Co přinese další rok? Chtěl bych se víc věnovat psaní. Dva články měsíčně.

    Chtěl bych psát o Kanbanu. Praktické zkušenosti (aktuálně máme za sebou další projekt), i víc osvětové a teoretické věci.

    V práci používáme na verzování Mercurial. Moc se mi ten nástroj líbí, takže nějaký ten článek by mu slušel.

    Gradle. Můj hřích - chtěl bych pokračovat v tutorialu (a dokončit ho). A taky udělat evangelizaci u nás v práci.

    Technical recruitment: chtěl bych napsat o vytváření týmu. A chtěl bych (opět) napsat o tom, jak dělám Java pohovory.

    Mind Map

    Myšlenkové mapy používám už dlouho, léta. Je to skvělý nástroj. Teď zrovna mám období znovu oživeného zájmu o ně a napadají mě další způsoby jejich použití. Třeba připravit si pomocí mind mapy strukturu článku. Je to docela zajímavý proces. Tak si zkusím zaexperimentovat a tyhle přípravné mapy k daným článkům publikovat.


    Související články

    Jak dělám Java pohovor II: proč nedávám testy?

    $
    0
    0
    Image courtesy of Michal Marcol
    FreeDigitalPhotos.net
    Je to už nějaký pátek, co jsem napsal (úspěšný) článek Jak dělám Java pohovor. Byl to pro mne výsledný stav určitého vývoje a shrnutí zkušeností z vedení technických (převážně Java) pohovorů, kterých jsem měl tehdy za sebou pár desítek.

    Hned od počátku jsem měl štěstí, že mi nikdo nemluvil do toho, jak má interview vypadat. A jsem za tu důvěru vděčný. Taková svoboda mi vyhovuje, takže jsem si jednotlivé kroky pohovoru sestavil a vymyslel podle sebe.

    Není to úplně jednoduchá věc, začít takhle z ničeho - není na to žádný mustr, informací je pomálu, není se moc koho zeptat, protože HR vám nejspíš neporadí a ten kdo dělal technický pohovory před váma, už nejspíš ve firmě nepracuje.

    Proč nedávám testy

    Jednu věc jsem věděl jistě - nechci používat žádné testy. Je s podivem, jak moc jsou testy na pohovorech rozšířené. Protože když uvážíme, jak malou mají, v daném kontextu, vypovídací hodnotu (osobně bych dokonce řekl mizivou) a jak velkou vyžadují režii na údržbu, aby aspoň k něčemu byly; člověk by řekl, že to za to nestojí.

    Trochu to chápu. Když už jednou někdo ty testy vytvoří, tak je může dát kandidátovi klidně slečna z HR. On už to pak někdo vyhodnotí. Takže na první pohled se to zdá jako jednoduchý, efektivní a objektivní způsob ohodnocení kandidáta. Ani jedno z toho není pravda.

    V první řadě, testy testují něco, na co kandidát téměř jistě nebyl připravený. Je téměř jisté, že ten obskurní syntaktický příklad, který v testu máte, nikdy v životě v praxi nepotkal. Ať už vám ta "chytrá" knížka, nebo internet, podle kterých jste to sestavili, tvrdí cokoliv. A nejde jen o to, že jsou příklady vycucané z prstu, problém je, že se na ně nedá nijak připravit - když si chci udělat certifikaci, vím, co se potřebuju naučit, jaký bude rozsah, co se dá použít ke studiu apod. Když jdu na pohovor, nevím nic - dostanu (nejspíš nekvalitní) test a záleží jen na štěstí, nakolik se moje zkušenost z obrovského Java kontinentu kryje s tématy v testu.

    Šíře Java landscape je další problém. Co chcete vměstnat do rozumné délky testu? Dejme tomu, že by test měl trvat hodinu, předpokládaný čas na otázku je tři minuty (takže kandidát nad tím nebude moc přemýšlet a jen vysype z hlavy, na co si vzpomene), což vychází na 20 otázek. Kolik otázek věnujete Java SE? Kolik Java EE, kolik Springu? A co něco souvisejícího, třeba databáze, nebo skriptování? Taky máte dojem, že to jen škrábete po povrchu?

    Možná si říkáte, zaměříme se jen na technologie, které používáme. OK, používáme na projektech Spring, tak budou testy o Springu. Právě jste se připravili o polovinu schopných lidí, kteří by u vás mohli pracovat. Na druhou stranu, třeba to tak chcete - jednodruhové, vyšlechtěné, single-malt vývojáře.

    Dalším problémem testů je jejich aktuálnost. Jak často vychází major verze nějakého frameworku/platformy? Když vezmu v potaz Java EE (verze 5 až 7), tak za poslední čtyři roky bych takový test musel předělat dvakrát až třikrát (beru v úvahu, že reálné využití se nekryje s vydáním specifikace). Kdybych řešil jen Spring (verze 2.5-4.0), jsem na tom podobně.

    A zmíním ještě jednu věc. Máte uni-sex testy "one-size-fits-all", které dáváte všem, bez ohledu na úroveň seniority? Máte pro každou senioritu zvláštní test? Jestli chcete dělat testy v rozumné kvalitě, budete s tím mít dost práce.

    Co nějaká výjimka?

    V tom, proč nedávat testy bych se mohl pitvat ještě dlouho, ale myslím, že pár zdatných (a dostačujících) důvodů jsem uvedl. Na druhou stranu, přeci jenom, nenašel by se nějaký případ, kdy testy u pohovoru dávají smysl? Přiznám se, nedávno jsem testy taky jednou použil. Či spíše přesněji: akceptoval je a podílel se na nich.

    Byl to ale velmi specifický případ. Měl jsem možnost podílet se na nabírání Java vývojářů na Filipínách. Nabírat vývojáře na druhé straně světa není úplně jednoduché. Jádrem přijímacího procesu byl osobní pohovor, kdy za stranu zaměstnavatele se na něm podílely osoby z Česka (já), Francie a USA. Když už si to konečně naplánujete interně, že se sejdete na druhé straně glóbu, je podstatný, aby vám na pohor přišli už jenom relevantní lidé.

    První filtrování udělalo místní HR. Jako druhý filtr jsem navrhoval klasický phone screen, ale vzhledem k časovému posunu (Česko-Filipíny +7 hodin) jsme se nakonec shodli právě na testech - hlavně z důvodu jejich asynchronicity. Napsal jsem tedy (s vydatnou a převážnou pomocí kolegy Bantera) test, který by byl takovým "rozumným" filtrem. Opravdu jenom filtrem, nic víc - pokud někdo neprošel testem, nemělo smysl se s ním vidět osobně.

    Na tomto testu jsou podstatné tři věci, které ospravedlňují jeho existenci: kontext, účel a trvanlivost. Kontext je, myslím, jasný - pohovory na jiném kontinentu zkrátka normálně nedělám. Účel jsem už také zmínil, šlo o pouhý filtr, při celkovém hodnocení kandidáta jsem k testu nijak nepřihlížel. No a "trvanlivost" - šlo o jednorázovou záležitost, ten test jsem od té doby neviděl, vidět nechci a kdyby náhodou, bylo potřeba řešit najímání vývojářů v Jižní Americe ;-)  začal bych ze stejné pozice: testy raději ne.

    Výzva

    Jestli děláte pohovory a dáváte na nich testy - zkuste se nad těmi testy zamyslet. Dávájí vám to, co od nich očekáváte? Je nějaká jiná cesta, jak dosáhnout stejného výsledku? Troufám si tvrdit, že bez testů se vám podaří najmout kvalitnější lidi. Zkuste to, jen tak se posunete dál.

    Mind Map



    Související články

    Code review checklist

    $
    0
    0
    Nedávno jsem v práci prezentoval, jaké přínosné věci používáme na aktuálním projektu. Vyzkoušeli jsme si spoustu zajímavých nástrojů a praktik a v podstatě to byla taková laboratoř, kdy ty funkční záležitosti použijeme na dalším projektu. Mind mapa níže shrnuje přehled prezentovaných témat.

    Jedním z nejcennějších realizovaných konceptů pro mne je, že se nám podařilo naimplementovat funkční a efektivní code review. (Doufám, že kolega Banter o tom brzy napíše článek.) A co čert nechtěl, po zmiňované prezentaci se nejvíc diskutovalo právě code review. Jedním z výstupů téhle diskuze je, že by bylo dobré mít nějaký code review checklist.

    Já takový checklist nemám, protože ke code review přistupuju intuitivně (což ale neznamená, že nevím, co přesně chci, naopak). Nicméně pro potřeby diskuze jsem si sesumíroval, co by v takovém checklistu mohlo být.

    Pozitivní věci na projektu (code review je fialový)

    Co je to code review?

    Ač se pojem code review používá v oblasti softwarového inženýrství dosti zhusta, má celkem nejednoznačný obsah. Pro někoho to je výsledek nástrojů jako je SonarQube, PMD, FindBugs ad. Tyto nástroje řeší tzv. statickou analýzu kódu a jsou výbornými pomocníky při udržování kvalitního kódu.

    Ale code review, tak jak ho chápu já, začíná tam, kde tyto nástroje končí. Prostě tam, kde stroje selhávají, či nestačí, přichází ke slovu "stará dobrá ruční práce". Dalo by se to také nazvat jako asynchronní peer review.

    Co je to code review checklist?

    Checklist ((kontrolní) seznam bodů) slouží k tomu, abychom na něco nezapomněli. Třeba koupit chleba a mlíko cestou z práce. V případě code review jde o to, nezapomenout projít některý z aspektů, které chceme v rámci review kontrolovat.

    Hlavní oblasti

    Věci, které tak nějak intuitivně kontroluji při code review by se daly shrnout do těchto základní oblastí:
    • Konvence
    • Design
    • Best-practices
    • Závislosti
    • Pokrytí testy

    Konvence

    Kdekoliv dochází k nějaké sociální interakci, jsou přítomny konvence. Buď již existují, nebo se začnou vytvářet. V dnešní době, kdy je vývoj software téměř vždy týmovou prací, je taková sociální (u některých programátorů a adminů spíše asociální) komunikace nevyhnutelná. Z hlediska code review, bych vypíchnul dva body, pro které je dobré konvence nastavit a dodržovat/kontrolovat:
    • Formátování zdrojového kódu napomáhá jeho čitelnosti, pochopitelnosti, orientaci v něm atd. Tahle oblast se dá z větší části kontrolovat pomocí statické analýzy kódu (např. v Javě nástroj Checkstyle), ale některé věci zkrátka nejde nacpat do (automatických) pravidel. Domluvte se na nich, dodržujte je a váš reviewer vás bude mít rád ;-)
    • Pojmenování. Věci by měly mít správná jména. Bude pak jasné, k čemu slouží, když se o nich budeme bavit, budeme více méně na stejné platformě a kdokoliv nový to lépe a rychleji vstřebá. Typicky, je dobré mít jmennou konvenci pro komponenty, balíčky, třídy, metody a proměnné. A cokoliv dalšího, co dává smysl a bude se vyskytovat ve více instancích.

    Konvence jsou velmi rozsáhlé téma. A stejně jako u spousty dalších věcí, o kterých budu psát, dochází k jejich přesahu do jiných oblastí. Berme to rozřazení do základních kategorií jako velmi volné.

    Design

    Tohle je moje oblíbené téma, a tak zde budu mít nejvíc položek. Je to taky z toho důvodu, že kontrola designu je pro mne jedním z hlavních cílů code review. Kdybych si měl vybrat jenom jeden aspekt, který revidovat, byl by to jednoznačně design.
    • Konceptuální diskuze. Důvod, proč často zamítnu reviewovaný kód je, že zavádí nějakou konceptuální změnu designu, která nebyla předem diskutovaná. Tohle má dvě složky. Jedna je subjektivní - mám určité designové preference a jelikož jsem většinou zodpovědný za architektonická rozhodnutí, tak je to moje právo a zodpovědnost. Druhá složka je týmová - pokud někdo "partizánsky" propašuje změnu, která bude ovlivňovat ostatní členy týmu, je to jasný důvod k zamítnutí. (Jen pro jistotu, partizánský zde má negativní konotace.) Obojí se dá jednoduše řešit zavedením designových review, kterých se účastní celý tým a kde se řeší design ještě před implementací.
    • Testovatelnost. Nejsem TDD evangelista (v dnešní době?!), ale koncept a zkušenosti s unit testy mne jako vývojáře hluboce ovlivnily. Myslím si, že největší přínos a benefit unit testů je, že mají pozitivní vliv na design produkčního kódu. Kód, který je obtížně testovatelný, je prostě špatný.
    • Konzistence. Systém/aplikace by měl být konzistentní napříč různými vrstvami, tj. odpovědnost jednotlivých vrstev/komponent, přístup ke zpracování výjimek, používané datové typy (třeba by pomohl kanonický datový model), přístup k logice (objektově, funkcionálně) atd.
    • Znovupoužitelnost. Na úrovni knihoven, komponent, tříd, metod.
    • SOLID. Systém/aplikace by měl respektovat dané/zvolené paradigma. V případě OOP by měl být "SOLIDní". Takže: Single responsibility, Open-close, Liskov substitution, Interface segregation, Dependency inversion. A objektový. Atd.
    • Logování by mělo být smysluplné, odpovídající a se správnou severitou a formátováním. Občas mě zaráží, jak málo vývojáři přemýšlí u logování nad tím, že aplikace poběží většinu svého životního cyklu na produkci.
    • Vyvarovat se: duplicity, komplexity, zanořené logiky (cykly, podmínky), věcí napevno napsaných v kódu (hardcoded). A smrtelně nebezpečné choroby DIY.

    Zdroj: Dilbert.com

    Best-practices

    Best-practices asi není úplně nejlepší název pro tuto kategorii. A určitě není vyčerpávající a jistě mi leccos propadlo sítem.
    • Kód by měl být čitelný a srozumitelný. Čitelný znamená, že po něm "oko dobře plyne", čemuž můžou napomoci konvence. A srozumitelný ve smyslu, že business logika by měla být jednoduše pochopitelná.
    • Externalizace. Některé věci by v kódu neměly být vůbec: konfigurace, internacionalizace, to co patří do properties, řetězce literálů. Často je něco řešeno konstantama, místo použití enumů.
    • Okomentovaný kód. Jestli je v kódu Javadoc se dá zkontrolovat statickou analýzou kódu. Jestli jsou ty komentáře aktuální, smysluplné a říkají to, co by měly, to už nám žádný nástroj neřekne. Pokud je kód čitelný a pochopitelný, mělo by v komentáři být popsaný hlavně výjimečné, či překvapující chování.
    • Zakomentovaný kód. Jednoznačně vyhodit! Už nikdy se nepoužije a bude tam hnít roky.
    • Neadresné TODO. Podobně jako zakomentovaný kód. Pokud mají vaši vývojáři potřebu si psát do kódu TODO, ať se tam aspoň podepíší. Stejně už se k tomu nejspíš nikdy nevrátí. Možná je to moje úchylka, ale nesnáším (měsíce, či roky staré) TODO v produkčním kódu.
    • Komity do VCS by měly být malé, časté, smysluplné a měly by řešit pouze jedinou věc. A měly by mít rozumný komentář, ideálně nastavený konvencí. Když vidím komit/changeset, kde někdo opravil "půlku internetu", otevírá se mi imaginární kudla v kapse.

    Závislosti

    Ve zkratce, měli bychom si dát pozor, co nám kdo do aplikace/systému zatáhne. To se týká hlavně externích knihoven, ale také interní závislostí mezi jednotlivými vrstvami a komponentami.

    Není to tak dávno, co jsem si tuhle říkal "proč je ta (Java EE) aplikace tak veliká?". Vypíšu si strom závislostí a ona je tam přibalená půlka Springu?!? Uf.

    Pokrytí testy

    Přiznám se, jednou jsem dělal na aplikaci, která měla 96% pokrytí testy. Ale jinak, nejsem žádný fanatik přes testy. Nicméně "rozumné" a "dostatečné" pokrytí testy by aplikace měla mít. Zejména business logiky. Naopak, není potřeba testovat platformu, či frameworky.

    A kde je ten checklist?

    Jak jsem psal v úvodu, tento článek je zamyšlením, co by v code review checklistu být mohlo. Možná, kdybych přemýšlel dost dlouho, tak bych dal dohromady i nějaký reálný checklist. Ale nechci. Mám rád, když jsou nastavená nějaká pravidla, ale musí umožňovat dostatek volnosti. Aby se dalo dýchat, aby nepotlačovaly invenci a motivaci. Diskuze je daleko důležitější, než mít nějaký papír na odškrtávání.

    Mind map




    Kanban, zprávy z fronty II

    $
    0
    0
    Máme za sebou, s týmem, další, úspěšnou implementaci Kanbanu. Projekt pomalu končí, je čas se ohlédnout. Jak to vypadalo, co fungovalo, co je potřeba zlepšit?

    O projektu

    Vzhledem k tomu, že z bezpečnostního hlediska se jedná o citlivé téma, nebudu psát nic o architektuře a technologiích. Což ale nevadí, protože z pohledu Kanbanu je obsah a typ projektu nepodstatný. Ale ať nám to povídání nevisí ve vzduchu, nastíním business case.

    Výsledkem projektu je/bude webová aplikace, s jejíž pomocí si zájemci mohou online zažádat o různé typy víz a povolení (pracovní, k pobytu apod.) a také je eventuálně online zaplatit. Aplikace, jako taková, je velmi hloupoučká, veškerá business logika a workflow zpracování žádosti se děje na backendu, který už není součástí naší dodávky.

    Team

    Šlo o malý projekt, takže i malý tým - 2 vývojáři, 1-2 testeři/integrátoři, 1 technical leader, 1 project leader. Celkově (a konstantně během celého projektu) nějakých pět lidí. Pouze dva členové týmu měli předešlou zkušenost s agilním vývojem, s Kanbanem pak pouze jeden. Tým byl technicky seniorní, žádný junior.

    Vizualize

    Základním přikázáním Kanbanu je vizualizuj! Všechno, co jde (a dává smysl), vše, co dá lepší viditelnost projektu.

    Kanban Board

    První věc, která se (obvykle) vyzualizuje, je projektové/procesní workflow. Použili jsme jak fyzický, tak elektronický board. Ten elektronický byl založen na issue tracking (ITS) nástroji Redmine.

    Bohužel, Redmine je, jako ITS, dosti nezralý/problematický a pro Kanban nemá žádný použitelný plugin. Problém jsme vyřešili "oklikou přes ruku" (= workaround) pomocí pluginu Wiki Lists, který dává přijatelný výsledek. Elektronický board byl primárním zdrojem informací a stavu.

    Elektronický Kanban board (Redmine a Wiki Lists plugin)

    Fyzický board byl druhotný zdroj informací. Používali jsme ho jako přirozené místo setkávání týmu (stand-upy). Další výhodou byla jeho neustálá přítomnost v open spacu. Takže všichni viděli :-)

    Každý člen týmu byl zodpovědný za synchronizaci svých tasků mezi ITS a fyzickým boardem.

    Fyzický Kanban board (stav na koneci projektu)

    Co stojí za zmínku na fyzickém boardu: je zde název projektu a číslo aktuálního releasu, grafy statistik (viz dále), bankovky přivezené ze služební cesty. Předpokládám, že stavy workflow jsou samo-vysvětlující. Assignment jsem řešili pomocí labelů (Vit, Lub, Seb atd.).

    Design kartiček

    Na kartičkách, které na fyzickém boardu představují jednotlivé tasky, může být spousta informací. Na rozdíl od elektronické verze, kde bývá spousta atributů, má kartička jen omezený prostor. Proto je potřeba zvážit, jaké informace na ni dát, aby byla zároveň informačně dostačující a přitom srozumitelná. Velmi podrobně se tomuto tématu věnuje (výborná) kniha Kanban in Action.

    My jsme začali a skončili u jednoduchého designu:
    • ID z ITS ve formátu #nnn (levý horní roh).
    • Zjednodušený název/summary tasku (uprostřed).
    • Zkratka komponentu/feature/user story (zeleně, pravý horní roh).
    • Délka setrvání ve stavu In Progress (červené tečky dole, tečka = den).
    • Indikátor kritické priority (červený vykřičník, nahoře uprostřed).
    • Indikátor blokace (červené B, pravý dolní roh).

    Design kartiček

    Class of Service

    Když jsme projekt začínali, měli jsme všechny kartičky žluté. Postupně jsme pak zavedli classes of service. U tohoto konceptu je podstatné, že každá třída má přiřazenou specifickou politiku, jak s ní zacházet. Má třeba jiné workflow, jinou prioritu atd.

    My jsme prvně odlišili tasky a bugy jiným workflow a bugy jsme na boardu odlišili růžovými lístečky (červené nebyly ;-)  Protože jsme měli zero bug policy, měl každý bug vždy vyšší prioritu než task.

    Později jsme zavedli ještě jednu třídu pro tasky - má neintuitivní název intangible (termín přejímám z knihy Kanban in Action). Do téhle třídy spadají tasky, které nemají přímou, hmatatelnou business hodnotu, nicméně je potřeba je udělat. Jsou to věci jako různé konfigurace, interní dokumentace, refactoring apod. Tato třída měla (s výjimkou přípravy releasu) prioritu nižší, než task.

    Třídy služeb (Classes of Service): žlutý - task, růžový - bug, zelený - intangible

    Limit WIP

    Moje zkušenost je zatím taková, že limitování WIP (Work In Process), je pro účastníky tou nejproblematičtější položkou Kanbanu - lidi vždycky nadávají, když jsou alokovaný na víc než jeden projekt, ale budou do krve hájit svůj "multi-taskinig". Myslím, že tady nás čeká ještě dlouhá cesta pomalé a trpělivé implantace principu stop starting, start finishing.

    Malou podporu Kanbanu v Redminu už jsem zmiňoval. Limit WIP v něm nejde nastavit, tak jsme si ho definovali "jenom" jako politiku - každý by měl pracovat v daný čas jenom na jednom tasku. Fungovalo to jen z půlky dobře, vývojáři obvykle toto "omezení" dodržovali, testeři obvykle ne. Celkově bych ale řekl, že pokud je WIP nastavený jenom politikou, může to i přesto dobře fungovat. Chce to jen trpělivě lidi vzdělávat, jít příkladem a s klidem to vyžadovat. Poučení pro mne - být důslednější.

    S WIP jde velmi často ruku v ruce otázka, co s blokovanými tasky? Není na to jednoduchá odpověď, částečně se to dá řešit flow, nebo politikou. Ale asi nejlepší je mít poučený tým - jak jsem kdesi četl (možná že Agile Samurai?) "zkušený agilní vývojář nikdy nezačne task, který není schopný dokončit". Čili prvně si task "před-nalyzovat" a odstanit rezistence a pak se teprve do něj pustit. Ne vždycky to jde, ale autonomní a uvědomnělý přístup členů týmu (opak skočím do toho pohlavě, neboli jdu rovnou bušit) mi dost často chybí.

    Manage Flow

    Kanban má rád autonomní lidi. Já taky. Kanban je pull system - když dám něco do TODO, vyhovuje mi, když to nemusím nikomu přiřazovat, ale libovolný člen týmu si to (podle svých schopností) vezme na starost. Jako team leaderovi mi to šetří obrovské množství času.

    Jeden člen týmu měl s tímhle přístupem silný problém, bylo to pro něj příliš volné, "bez pravidel". Opět platí: vysvětlovat, vzdělávat. Plus, Kanban holt není pro každého, někdy si lidé a proces nesednou.

    Workflow tasku na tomhle projektu je jedna z věcí, které se nám, myslím, dost povedly. Jedním z podstatných rysů flow byla silná podpora formalizovaného code review (můžete se těšit, až o tom Banter napíše článek).

    Za zmínku stojí stav merge. Původně to byl jenom pseudo-stav (neměl svůj obraz v ITS). Ale vzhledem k asynchronní povaze našeho code-review procesu a občasné distribuovanosti týmu (home office, služební cesty), se vyplatilo z něj udělat svébytný stav.

    Workflow tasku

    Na počátku projektu jsme měli také samostatný stav pro blokované tasky. Ale pak jsme ho zrušili a nahradili blokujícím atributem přímo na issue. Důvod je prostý. Toto byl už druhý projekt, kde jsem měl v rámci Kanbanu stav blocked a vždycky to dopadlo stejně - tento stav se stal odkladištěm (až smetištěm) pro blokované tasky a nikdo (ani já) se moc nesnažil s tím něco dělat, odblokovat je. Řekl bych, že blocked atribute v tomhle funguje lépe a navíc není svázaný jen s jedním stavem - věci můžou být blokované ve vývoji, testování, integraci atd.

    Další věc, kterou jsme v rámci flow zavedli byla fronta pro tasky čekající na otestování. Projekt byl z hlediska testerů podhodnocený, takže tasky se nám tam hromadily zcela přirozeně. V Kanbanu je to pěkně vidět - když se vám někde začnou štosovat lístečky, máte (možná) problém. Z hlediska teorie jde o úzké hrdlo a obvykle stojí za to ho trochu rozšířit, nebo odstranit.

    My jsme to řešili dvěma způsoby: jednak jsme se zaměřili na automatizaci (Selenium testy), což pomohlo pouze částečně (testy fungovaly spíše regresně, než že by testovaly nově vyvinuté tasky) a jednak jsme úspěšně zalobovali za alokaci dalšího testera.

    Statistiky

    Se správou flow souvisí také jeho měření. Statistiky jsme používali, ale až takový přínost to pro nás nemělo. Z několika důvodů:
    • Se sbíráním statistik jsme začali pozdě. To bylo dané hlavně téměř nulovou podporou a využitelností reportingu v Redminu. Polovinu údajů pro statistiky bylo potřeba získávat ručně. I při malém týmu to bylo dost pracné.
    • Změny v našem flow byly celkem drobné. Ve spojení s předešlým bodem, je otázka, jak moc by se změny projevily a jak by to bylo průkazné.

    Takže to byla spíš taková zajímavost a zkušenost pro příští projekt. Metriky, které jsme sbírali, byly throughput (propustnost, velocita) a lead time (trvání dokončení tasku).

    Týdenní velocita

    Statistiky jsme dělali jak pro "obecné" issue, tj. task bez ohledu na jeho typ a velikost, tak pro tasky odhadnuté pomocí triček (T-shirts). Ze statistiky tak např. vyplývá, že průměrná velocita týmu za týden byla 6 tasků, a průměrné dokončení tasku odhadnutého jako S trvalo 2,5 dne. (Dokončení je myšleno tak, jak ho chápe Kanban, takže vyvinuto, zreviewováno, otestováno, deployováno.)

    Lead Time podle relativní velikosti tasků

    Explicit Policies

    Explicitní politiky jsou důležité. Je pak nad čím diskutovat a není to hospodská tlachačka o něčem "co všichni ví" a "takhle se to vždycky dělá". Obecně, nemělo by jich být moc, měly by být jednoduché a měly by být snadno přístupné. Naše politiky jsme měli na projektové wiki a zahrnovaly:
    • Stand-up: jaký je jeho smysl a jaké má pravidla.
    • WIP = 1: každý dělá v daný čas pouze na jediném tasku.
    • Zero Bug Policy: každý reportovaný bug je automaticky kritický a musí být opraven, než se začne pracovat na novém tasku.
    • Pravda je v ITS: primární zdrojem stavu projektu je trackovací systém. Každý je zodpovědný za aktuálnost a synchronizaci svých tasků.
    Co mi chybělo a ocenil bych, je Definition of Done. Tak příště.

    Implement Feedback, Improve Collaborativelly

    Na rovinu, tyhle dvě věci nám moc nešly. Sice jsme měli retrospektivy, ale nevzpomínám si, že by to nějak ovlivnilo věci kolem Kanbanu, flow apod. Na jednu stranu to trochu chápu - tým byl Kanbanem nepolíbený, a autonomním se člověk nestane přes noc. Vysvětlovat, vzdělávat, působit. Chce to čas.

    Pravidelné týmové aktivity

    Následující praktiky nejsou součástí Kanbanu. Ale velice dobře se s ním pojí.

    Stand-up

    Denní stand-up, agilní to klasika. Pro popis bude nejjednodušší, když ocituju naši politiku:

    The main purpose of the stand-up is that the team get the current context of the project.

    The stand-up should be:
    • short - max. 10 minutes,
    • focused - see the main purpose above,
    • with participation of the all team members,
    • in front of the Kanban board.
    The stand-up shouln't be used for:
    • discussions which don't involve all the team,
    • solving the technical problems.
    If such situation happens (discussion, problem),
    • it should be rather solved after stand-up,
    • ideally in the phone box rather than in open-space,
    • only with people who are interested/involved in the problem.
    The typical stand-up participation is:
    1. What did I do yesterday?
    2. What will I do today?
    3. What is blocking me.

    U stand-upů se mi opět potvrdilo, to co u jiných agilních praktik - lidi, kteří s tím nemají zkušenost, můžou prvně "frfňat". Ale jen do té doby, než "to začnou dělat". Pak přijde něco jako prozření. Problém s akceptací jsme měli u jednoho člena týmu, ale potom, co jsme si to vysvětlili a deklarovali výše uvedenou politiku, už to bylo v pořádku.

    Že to dobře fungovalo, můžu ilustrovat faktem, že tým nepotřeboval týdenní statusy (byly by zbytečné), protože stav všichni pobrali během stand-upů.

    Retrospektivy

    Retrospektivy jsme začali dělat cca v půlce projektu. Pro mne to bylo premiérové téma, proto jsem nechal retrospektivy řídit zkušenějšího kolegu a sám jsem se ponořil do studia. Hodně mi v tom pomohla kniha Agile Retrospectives.

    Retrospektivy jsou pro mne ještě příliš čerstvé téma, takže je zatím nebudu hodnotit. Ale pocitově, intuitivně z nich mám dobrý pocit a chci je použít na dalším projektu.

    Prioritizace

    Prioritizovat je potřeba snad na každém projektu. Někdy víc, někdy méně formálně. V Kanbanu to může být stěžejní záležitost. U nás jsme se domluvili, že prioritizaci budou dělat technical a project leader. Naplánovali jsme to týdně na páteční ráno, aby bylo od pondělí jasno, co si lidi můžou brát.

    Moc to nefungovalo, sešli jsme se jen párkrát. Přesto to nějak jelo bez větších zádrhelů, možná tomu napomohla automatická prioritizace vyplývající z classes of service (viz výše). U většího projektu by to asi byl dost problém. Prostě další oblast pro zlepšení.

    Odhady

    Na projektu jsme zavedli relativní odhady tasků pomocí triček (T-shirt estimations). Používali jsme velikosti S, M, L a XL. Pokud něco mělo velikost XL, bylo potřeba to dále rozbít na menší části. Pro odhadování samotné jsme používali planning poker s odpovídajícími hodnotami karet.

    Odhady jsme dělali jednou týdně, většinou to zabralo hodinu. Členové týmu si stěžovali, že to jde pomalu (odhadne se toho málo), na druhou stranu oceňovali diskuzi, která nad tasky vznikla a umožnila tak lépe pochopit daný problém.

    Odhady jsme začali dělat přibližně ve stejné době jako retrospektivy, takže neměly tak velký přínos, jak by mohly, kdybysme s nimi začali už na začátku projektu. Pozitivně vnímám, že je dělal celý tým. Naučili jsme se, jak používat trička a na dalším projektu budeme pokračovat.

    Zhodnocení

    Toto je druhý projekt, kde jsem aplikoval Kanban a potvrdilo se mi, že je to životaschopný a přínosný nástroj. Jako u všeho, co je tvořeno "měkkými" pravidly, hodně záleží na poučenosti lidí v týmu. Jednou z hlavních zkušeností je pro mne: vysvětlování není nikdy dost - tady se budu muset ještě hodně zlepšit. Ale doufám, že už jsem své kolegy naočkoval a příště to bude zase o něco snadnější.

    Myslím, že učednická léta už mám v Kanbanu za sebou. Teď je potřeba zaměřit se na pokročilejší témata a zlepšit a dotáhnout do konce věci, jako jsou metriky, třídy služeb, plánování a odhady, používání modelů ad.

    Už teď je jasné, že Kanban použiju na příštím projektu. Takže cca za rok si budete moci přečíst další díl tohoto článku. Nebo seriálu? ;-)

    Mind Map




    Související články

    Mercurial, strategie branch-by-feature

    $
    0
    0

    Mercurial je skvělý, distribuovaný Version Control System (VCS, či DVCS), který nabízí velkou míru volnosti, jak s nakládat s verzováním zdrojových kódů. Svobodu většinou chápeme jako pozitivní věc, někdy je ale přílišná nespoutanost na škodu. A tak definování nějaké verzovací strategie prospěje týmu i projektu.

    Proč mít verzovací strategii?

    Verzovací strategii branch-by-feature jsme s úspěchem použili na stávajícím projektu. Důvody, proč jsme si něco takového definovali byly dva:
    • Když jsem se mihnul na předcházejícím projektu (taky Mercurial), žádná strategie, či konvence definovaná nebyla . Člověk pak slýchal řeči jako: "Proč to furt merguješ?", "Vznikaj ti tam anonymní branche." a "Tam by's měl používat rebase.". Prostě klasický, tohle-tady-všichni-ví a takhle-to-děláme-ale-tobě-jsme-to-neřekli.
    • Chtěli jsme mít na nadcházejícím projektu formalizované code review.

    Takže jsme se zamysleli, chvilku nad tím špekulovali a pak jsme, spolu s podporou dalších nástrojů, došli k následující strategii.

    Strategie branch-by-feature

    Princip téhle strategie je jednoduchý a dá se popsat jednou větou: Pro každou novou feature (nebo bug) se založí nový branch. Hotovo, vymalováno.

    A teď trochu obšírněji. Na počátku je v repozitory pouze jeden permanentní branch. Zpravidla se mu říká development branch. Z něj se odlamují další branche pro vývoj - feature branche. Co přesně tyto branche představují, záleží na granularitě položek, do kterých jsme si práci rozdrobili. Může to být user story, feature, requirement, task. Ideálně je to něco, co evidujeme v issue tracking systému (ITS).

    Probíhá běžný vývoj a všechny komity jdou do (odpovídajícího) feature branche. Když je vývoj hotový, proběhne code review a pokud jsou změny akceptovány, zamergují se do development branche a feature branch se zavře. Pokud jsou změny zamítnuty, provede se náprava, komitne se do feature branche, následuje code review atd.

    Pokud jsou v této fázi nalezeny nějaké bugy, přistupujeme k nim stejně jako k feature. To jest, bug branch -> code review -> merge do development branche.

    Verzovací strategie branch by feature

    Po nějakém čase vznikne release branch. Pokud jsou v něm nalezeny chyby, vzniká bug branch a po code review přichází merge jak do release, tak do development branche.

    Celý postup se dá shrnout do následujících bodů:
    1. Vytvoření nového feature/bug branche.
    2. Development.
    3. Změny projdou code review.
    4. Uzavření feature/bug branche.
    5. (Bugfixy jsou zamergovány do release branche.)
    6. Změny jsou zamergovány do development branche.

    Z pohledu příkazové řádky vypadá proces takto:
    $ hg branche fb-logging
    $ hg commit -m 'Logging feat. has been developed.'
    $ hg commit -m 'Close branch fb-logging.' --close-branch
    $ hg update default
    $ hg merge fb-logging
    $ hg commit -m 'Merge branch fb-logging -> default.'

    Zcela záměrně se vyhýbám popisu code review. To proto, abych nekradl materiál svému kolegovi Banterovi, který již jistě brzy napíše článek, o tom, jak to děláme (je to fakt cool, tak se těšte). Nicméně, ve vztahu k Mercurialu si nemůžu odpustit, jak to vypadá procesně. Přepokládám, že všichni čtete plynně BPMN ;-)  takže dalších slov netřeba. Mercurial aktivity jsou v oranžovém rámečku.

    Code Review proces (oranžové jsou aktivity v Mercurialu, modré v RhodeCode)

    Drobná a příjemná vylepšení

    Což o to, proces, jako takový, je pěkný. Na někoho je ale možná trochu komplexní. Přece jenom, když mastíte celý život všechno jenom do trunku, může to být trochu moc věcí najednou. Tady je pár věcí, které nám to o něco usnadnili.

    Konvence

    Konvence jsme měli nastavené jednak pro názvy branchů a jednak pro komitovací komentáře. Název nového branche se skládal z prefixu a čísla issue v ITS. Prefix byl buď fb- (feature branch), nebo bb- (bug branch). Např. fb-42, bb-1024.

    Konvence pro komentáře by se daly rozdělit do tří skupin: běžné komentáře, při zavírání branche a při vytváření releasu. Konvence samotná by se v Mercurialu dala pohlídat pomocí hooku, ale nedokopal jsem se k tomu, ho napsat. Pro "běžné", vývojové komentáře jsme měli konvenci WIP #nnn; some comment. WIP je zkratka pro Work In Progress, nnn je id issue v ITS. Např. WIP #1561; Payment button has been removed.

    Zavření branche se skládá ze čtyř Mercurial příkazů (commit, update, merge, commit, viz výše) a obsahuje dva komentáře ve formátu:
    • Close branch <branch-name>.
    • Merge branch <branch-name> -> default.

    Za zmínku stojí mergovací komentář, ze kterého by mělo být jasné, odkud kam merge proběhnul.

    Komentáře při zavírání branche

    Releasovací komentáře byly celkem čtyři a obsahovaly klíčové slovo [Release].

    Komentáře při vytváření releasu

    V předešlém popisu vás možná zarazilo, že jak pro zavření branche, tak pro vytvoření releasu je potřeba spustit čtyři Mercurial příkazy. Dělat to ručně by byla značná otrava a hlavně by celá konvence brzo erodovala do chaosu. Šťastni kdož používají automatizaci, neboť jen ti vejdou do křemíkového nebe.

    Mercurial alias

    S používáním aliasu přišel kolega Banter, takže mu za to patří dík a rád ho zde zvěčním. Alias samotný vypadá dost ošklivě, zato jeho použití je elegantní. Jedinou vadou na kráse je, že jsme nepřišli, jak alias spustit z grafických nástojů, jako je SourceTree, nebo TortoiseHg, takže ještě budeme muset zapracovat na tom, aby tuto fičurku mohli používat i kolegové, kteří ještě nepřišli na to, jak cool je používat command line ;-)

    Alias stačí přidat do souboru ~/.hgrc a spouští se jednoduchým příkazem hg close-feature nnn, kde nnn je (v našem případě) čístlo issue v ITS, tj. to, co je za prefixem fb-.
    [alias]
    close-feature = ![ -z "$1" ] && echo "You didn't specify a branch!"&& exit 1; \
    if hg branches | grep -q "fb-$1"; \
    then $HG up fb-$1; \
    $HG commit -m 'Close branch fb-$1.' --close-branch; \
    $HG pull; \
    $HG up default; \
    $HG merge fb-$1; \
    $HG commit -m 'Merge branch fb-$1 -> default.'; \
    else echo "The branch fb-$1 does NOT exist!"; \
    fi

    Gradle release task

    Náš projekt buildujema Mavenem. Chvilku jsem se snažil napasovat Maven Release plugin na naši branchovací strategii, ale pořád to nějak nebylo ono - je to prostě moc šitý na SVN. Pak jsem ztratil trpělivost a odpovídající chování si napsal jako Gradle task. Časem se z toho snad vyklube Gradle plugin.

    Task samotný tady uvádět nebudu, protože je asi tak na tři stránky. A taky potřebuje ještě trochu poladit. Zkrátka ještě není zralý na to, abych ho dal z ruky. V podstatě ale dělá pouze to, že přepíná branche, šolichá s Mercurialem a manipuluje s verzí v pom.xml. A dělá to ty hezké komentáře, co jsem uváděl výše.

    Pros & Cons

    Celý výše popsaný koncept jsme vymysleli ještě před projektem. Pak přišel projekt a emotivně musím říct, že nám to krásně fungovalo. Jako hlavní benefit vidím, že jsme si formalizovali proces code review a s výše uvedenou branchovací strategií to bylo velice efektivní. Dalším plusem byla, "úhledná" práce s Mercurialem, kdy byla radost se prohrabávat verzovanou historií.

    K negativům bych zařadil komplexnost. Pokud by nám nešlo o code review, asi by tato strategie byla zbytečná. Zatím mi taky chybí nějaká podpora v grafických a automatizačních nástrojích. Jako milovníkovi CLI mi to osobně nijak nevadí, ale musím myslet taky na ostatní členy týmu (bývalý kolega jim říkal "makáči" :-)  pro které by mělo být používání nástrojů co nejsnadnější.

    Je to všechno?

    Abyste dostali plný obrázek, jak to celé fungovalo, chybí nám jeden velký dílek skládanky - jo, code review. Takže pokud vám něco nedává smysl, tak je to možná proto, že jsem v tomto článku celkem důsledně odpáral použití dalších dvou nástrojů, které byly s branchovací strategii organicky provázané - issue tracking system a RhodeCode, nástroj, ve kterém jsme, pomocí pull requestů, řešili code review.

    Popis code review je na samostatný článek. Tak snad ho Banter brzo napíše a já sem pak lísknu odkaz. A jinak doufám, že vám zmiňovaná strategie branch-by-feature přijde inspirativní.

    Happy branching! :-)

    Mind Map



    Související články

    Můj pohled na Agile Prague 2014

    $
    0
    0
    Byl jsem na konferenci Agile Prague. Bylo to poprvé a hned tak se tam nevrátím. Ne, že bych své účasti litoval - našel jsem si tam pár zajímavých myšlenek a odkazů na dodatečné zdroje. Ale celkový dojem z konference mám rozpačitý - pro koho je vlastně určena?

    Shrnutí

    Můžu se krutě mýlit, ale podle obecenstva bych odhadoval, že tak 70-90 % byli SW inženýři, s převahou vývojářů. Většina z nich buď už má zkušenost s agile, nebo ví o co jde, nebo aspoň po agilitě touží. Pro tuhle kategorii, obávám se, konference mohla nabídnout stěží něco nového, něco inspirativního. Teda kromě "kmenové družby". Sám za sebe bych to shrnul následujícím tweetem:

    Přišlo mi, že většina přednášek by byla nejvíc přínosná pro kategorii, která na konferenci zcela/téměř absentovala - střední manažment. Nevím, čím to bylo, ale skoro všichni řečníci se drželi na velmi abstraktní rovině. Pořád se mluvilo o problémech, které agile adresuje, ale jen minimálně o konkrétních řešeních. A hlavně, srovnávat (opakovaně!) v roce 2014 (13 let po Agilním manifestu!) vodopád s agilním vývojem... hm, mlácení prázdné slámy?

    Co se mi nelíbilo

    V následující sekci nebudu psát pozitivní věci - chtěl bych proto předeslat: jde o můj, striktně subjektivní pohled. Pokud něco kritizuji, tak proto, že to nedosáhlo mých očekávání. Nemusí to ale říkat nic o skutečné, nebo obecně přijímané kvalitě. Jsem někdy solipsista... už od dětství.

    A směrem k pořadatelům: jsem rád, že takovouto konferenci pořádáte. Vím, že je za tím spousta práce a je fajn mít něco takového v Praze.

    Agile != Scrum

    Tenhle pocit už mám dlouhodobě. Když "běžní" lidi mluví o agile - a řečníci na konferenci to zhusta autorizovali - tak zazní něco (byť ne tak explicitně) jako:
    "Být agile" = "dělat" Scrum
    Zajímalo by mě, jestli máte jinou zkušenost? Já když poslouchám diskuze o agile, tak cca 80 % času/prostoru je věnováno klábosení o Scrumu.

    Jen výjimečně (a díky za to) zaznělo:
    Individuals and interactions over processes and tools

    Case Studies

    Case studies jsem viděl dvě (Home Credit a Skype) a obě patřily k (informačně) nejslabším příspěvkům na konferenci. Když jdu na case study, tak očekávám, že se dozvím něco z toho, "jak to dělali". Nezajímá mě historie a struktura firmy. A když je na talk 20 minut, tak mě nezajímá ani kontext, v jakém to probíhalo - není na to čas. Chci vědět, jak to dělali! To jsem se ani z jedné case study nedozvěl.

    Co si z toho odnáším, tak že v Home Creditu měli problém telefonovat do Asie (technické problémy) a ve Skypu použili na odhady story points, které měly konkrétní velikost (hodiny a dny - takže už jaksi nešlo o relativní, ale absolutní odhady). To asi není to, co řečníci zamýšleli předat publiku.

    Zaměření, pointa přednášek

    Možná jsem přespříliš kritický, ale poučen Scottem Berkunem očekávám, že přednáška bude mít nějakou pointu, myšlenku, kterou chce sdělit. O to spíš, že trvá pouze 20, 30, max. 45 minut.

    Přiznám se, občas jsem se musel během prezentace opakovaně podívat do programu na název přednášky, abych si připomenul o čem je téma. A párkrát jsem se usilovně snažil do posledních sekund nalézt pointu toho, co jsem zrovna půl hodiny poslouchal.

    Nekonkrétnost

    Několikrát jsem na přednáškách zaslechl rady jako: "We should embrace the Agile Manifesto!", "We need to find leaders!" apod. Aspoň jak jsem to pochopil, nebyly to mobilizační výkřiky - byly to vážně míněné rady, jak řešit předeslané problémy. Ehm, jak? To je to, proč jsem přišel na tuhle přednášku, konferenci. Jak se to dá udělat? Nebo alespoň, kde se mám inspirovat, kde si to můžu dostudovat? Nevím. Nevím, v těchto otázkách víc, než jsem věděl před konferencí/přednáškou.

    Bonding

    Nejsem mizantrop, jsem jen bytostný introvert. A nesnáším, když mě někdo z pozice autority (řečník, nebo pořadatel) nutí dělat věci, které jsou mi jako introvertovi nepříjemné. Což je třeba diskuze ve veřejném prostoru s cizími lidmi. Nebo se ptát sponzora konference na heslo k wifi!?!?

    Wifi

    Myslím si, že je v dnešní době faux pas, když není na konferenci k dispozici slušná wifi... pro všechny. Aby to bylo jasné: heslo na wifi pro prvních 100 (z cca 250), není pro všechny. A to tím spíš, pokud poskytnu program konference v elektronické verzi, která vyžaduje být online.

    Ano, můžou být legitimní důvody, proč není wifi připojení uspokojivé, či dostačující. Pak je ale férové to říct narovinu. A ne žoviálně odtušit "better be quick". Failure.

    Co se mi líbilo

    Linda Rising

    Jednoznačnou hvězdou konference pro mne byla Linda Rising (@RisingLinda). Tahle agilní babička (72 let!!) doručila jedinou inspirativní keynote celé konference a i její druhá přednáška byla velmi pěkná.

    Její keynote měla název The Power of the Agile Mindset a dala by se zhustit do věty Na počátku bylo slovo. Celé to bylo o tom, jakou úžasnou schopnost máme k dispozici - jedinou větou můžeme určit trajektorii skupiny na dlouhou dobu a doširoka rozevřít nůžky mezi úspěšnými a neúspěšnými. Mezi těmi, kteří hledají řešení a těmi, kdo hledají chyby a viníky. Mezi těmi, kdo na sobě pracují a kdo o sobě lžou (aby vypadali lépe). A mezi agilním a fixním mindsetem.

    Paul Klipp

    Paul Klipp byl jediný řečník, kterého jsem před konferencí znal. Těšil jsem se na něj a nezklamal mě. Ba co víc, překvapil mě. Jeho přednáška se jmenovala Improve your communication skills dramatically without saying a word. Jako jediný speaker mluvil bez slidů(!) a součástí byla i 3minutová meditace(!!), která však do přednášky organicky zapadla.

    Je zbytečné, abych tady přepisoval a parafrázoval Paulovu myšlenku - doporučuji přečíst si jeho blogpost Improve your communication skills by learning to listen, nebo se aspoň podívat na přípravnou mind mapu.

    Organizace jako doprava

    Zábavná a osvěžující byla přednáška Hanse BrattbergaTraffic, Organizations and Lean, kde přirovnával fungování firmy (a hlavně přístup k projektům) k dopravním situacím. Křižovatka v Hanoi, kruhový objezd na Champs-Élysées, šestiproudá dálnice, couvání v jednosměrce atd.

    Každé srovnání kulhá. Ale tady nešlo o nalezení analogie, ale o zobrazení určitých zákonitostí pomocí nadsázky. Třeba že couvání v jednosměrce je vlastně podvádění (protože se nám nechce objíždět blok). Na druhou stranu, jak Lean, tak doprava pracuje s flow, kapacitou apod., takže něco podobného tam bude.

    Produktové flow nestačí

    I když osobně nepovažuju Kanban za (striktně) agilní záležitost, přece jen mě dost překvapilo, že na konferenci o něm nebylo vůbec nic! Nejvíc se mu blížila přednášky Martina BurnseProduct Flow Is Not Enough!. De facto to bylo o Kanbanu, i když, jestli si dobře vzpomínám, tak slovo Kanban tam ani jednou nezaznělo. Nebo to bylo o Lean? ;-)

    Martin měl taky velmi pěkné, ručně malované slidy, které bohužel nejsou (zatím?) dostupné. Můžete je ale vidět v jeho přednášce na YouTube. (V Praze mluvil o moc líp = plynuleji, ale Kanban fakt neřekl.)

    Total Recall, eh, Terraforming

    Další (nejen) zábavná přednáška byla od Caludia Perroneho: Terraforming Organisations: Journey of a Lean Changer. Tahle přednáška hodně vycházela z Toyoty a Lean, plus A3 Thinking, ale směřovala k originálním nástrojům ("myslící" karty a Popcorn flow, viz slidy níže).

    Nicméně, to co mi hlavně utkvělo v hlavě, je slide kdesi z prostředka prezentace:



    Krásně to ilustruje můj pocit z většiny implementací Scrumu, co jsem jich v enterprise viděl - vývojáři si vesele "scrumují" a nad nima je zabetonovaný klasický hierarchický manažment.

    #NoEstimates

    Na #NoEstimates jsem poprvé narazil v knize Kanban in Action. Je to zajímavá myšlenka, s Kanbanem se velmi dobře pojí a řečník Vasco Duarte ji přednesl srozumitelně. Čím se Vasco, bohužel, moc nezabýval - jak to udělat na začátku projektu. Studijními zdroji taky zrovna neplýtval - prostě to stavěl jako takové postuláty. A publikum bylo asi dost zaskočené, protože se na to taky nikdo nezeptal.

    Catering

    Ruku na srdce - dobré jídlo ke konferenci patří a já jsem byl spokojený. Obědy byly chutné, dortíky dobré, kafe (na konferenci) slušné, džusů dostatek, nemůžu si stěžovat :-)

    Co jsem si odnesl

    Ačkoliv jsem šel na agilní konferenci, tak to, co jsem si odnesl, se netýká agile, ale leadershipu - víc na sobě pracovat, jako servant leader. Takže z tohohle pohledu jsem spokojený. Ale z pohledu agile jsem zklamaný - vzhledem ke své pozici mám v práci (omezenou) možnost prosadit určité věci, nastavit kulturu, doporučit nástroje apod. A bohužel, v tomto směru si z Agile Prague 2014 neodnáším žádnou inspiraci.

    Související externí články

    Cesta samuraje, rok čtvrtý

    $
    0
    0
    Normálně by se řeklo, že SoftWare Samuraj slaví čtvrté narozeniny. Ale tentokrát to na žádnou velkou oslavu není - z hlediska blogování to bylo velmi slabý. A důvody jsou dost podobné jako vloni.

    Maratony

    Z volného času mi nejvíc ukrojilo běhání. Vloni jsem běžel dva maratony, letos také dva a jeden až dva mě ještě čekají. Myslím, že trénování na maraton (a maraton samotný) je výborná analogie k softwarovým projektům.

    Třeba, že je to tvrdá dřina. Že je nesmysl sprintovat hned na začátku. Že zvítězí (či dokončí) ten, kdo má strategii. Že pokud je commitment, tak je nesrovnatelně větší šance na úspěch. A hlavně, maratony (a projekty) se "běhají hlavou".

    Distribuovaný projekt

    Pracovně jsem absolvoval velmi náročný projekt a jeho začátek se kreje s koncem mého psaní. Projekt byl sice krátký (od listopadu do května), ale za to vyčerpávající - je to první projekt v mé kariéře, kdy si musím vzít dovolenou, abych si odpočinul.

    Proč vyčerpávající? V první řadě, to byl distribuovaný projekt. A nejen distribuovaný, ale vskutku globální - zákazník byl v Urugayi, project management ve Francii a (menší) půlka implementačního týmu v Praze a druhá půlka na Filipínách. Sice je to fráze, ale na tomhle projektu to platilo beze zbytku - communication is the key.

    Druhým stěžejním důvodem byla relativní juniorita týmu. To nebyl problém z technického hlediska - technické problémy jsou ty jednodušší k řešení. Problém byl, že se nepodařilo vytvořit silnou týmovou kulturu. Samozřejmě, tohle jde z větší části za mnou, za team leaderem, a vidím to jako své selhání. Už několik měsíců jsem tak ve stadiu analýzi, proč k tomu došlo a co jsem mohl udělat jinak, nebo lépe. Hodně mi v tom pomáhá výborná kniha Coaching Agile Teams.

    Na druhou stranu, když team nechce dát commitment, tak s tím nic nenaděláte a můžete se snažit, jak chcete. A je to potom náročnější pro project managera, team leadera a další, protože team na ně přesouvá zodpovědnost. A na tomhle projektu to bylo náročné velmi.

    Ale nechci si stěžovat, projekt považuji za úspěšný - dodali jsme v čas, v budgetu, v rozumně dobré kvalitě a hlavně, zákazník je spokojený a chce s námi dělat další projekt.

    Závazek

    Již dvakrát jsem v tomto článku zmínil termín commitment. Ano, momentálně ho považuji za klíčový nástroj, který odděluje úspěšné od neúspěšného. A protože bych zase chtěl začít pravidelně psát, tady je můj závazek:
    • Napsat alespoň jeden článek měsíčně.

    Související články

    Jak dělám Java pohovor III: phone screen

    $
    0
    0
    Technickému recruitingu se věnuji už nějaké čtyři roky. Je to činnost, která mě hodně baví a tak jako u jiných aspektů své práce, jsem si vypěstoval určitý postup. Zároveň se snažím věci pořád zlepšovat a korigovat, jak studiem, tak praxí.

    Phone Screen

    Jedna z věcí, ke kterým jsem došel a považuji ji za nutnost, je phone screen. Jediný případ, kdy ho nedělám, je buď že mám s daným člověkem přímou pracovní zkušenost, anebo jsme se předtím už osobně setkali - to se stává, pokud třeba někdo zareaguje na můj inzerát.

    Poslední dobou si hodně čtu o agilním přístupu (i po těch letech se člověk pořád má co učit) a věc, která se mi stále vrací a furt si ji musím připomínat - každý mítink musí mít smysl. Fajn, jaký je tedy pro mne smysl phone screenu? Podívejme se, co stojí v soukromém samurajském slovníku:

    Phone Screen:Je to první, krátký a efektivní kontakt s potencionálním kolegou, který zodpoví jedinou otázku - má smysl se osobně vidět a pokračovat ve vzájemném získávání informací?

    Proč používám termín phone screen a ne třeba "telefonní pohovor"? Inu, to proto, že je to krátké a přesně to vystihuje svůj účel. Uznejte - "telefonní filtrování" zní blbě samo o sobě a poslat kandidátovi pozvánku s takovým předmětem by asi nebylo zrovna vstřícné. 

    Struktura

    Můj phone screen má vždy stejný začátek. Zavolám, představím se jménem a firmou a řeknu: "Tento phone screen by měl trvat 30 minut a projdeme si následující kroky:
    1. představím se já,
    2. představí se kandidát z hlediska technologií,
    3. technické otázky,
    4. kandidátovy otázky."
    Pak si cca 30 minut povídáme, během té doby bedlivě sleduji čas, a po půl hodině rozhovor ukončím.

    Pokud se podívám blíže na jednotlivé body:

    Představím se já, tedy, znovu zopakuji svoje jméno, řeknu svoji formální pozici a krátce vysvětlím obsah své práce. Myslím si, že je to fér vůči kandidátovi - dát mu nějaký kontext, aby věděl, s kým asi tak mluví.

    Představí se kandidát z hlediska technologií. Jediná informace, kterou o kandidátovi v tento moment mám, je zpravidla pouze jeho CV. Což je dost slabá a nevěrohodná informace. Požádám proto kandidáta, aby se mi představil z hlediska technologií. Zdůrazním, že mě nezajímá klasické "odříkávání"životopisu, stejně tak, jaký byl business význam projektů, nebo aplikací, na kterých se podílel. Co mě zajímá, je jeho současný technologicko-seniorní "snapshot".

    Myslím, že je to celkem logické - nenajímám odborníka na nějakou business doménu, ani business analytika, ale vývojáře. Takže mě zajímají technologie, frameworky, architektura atd. Bohužel, lidé dost často tuto otázku ignorují a spustí naučený kolovrátek. Pokud se tak stane (pořád sleduju ten čas), vrátím je zpátky k původní otázce.

    Technické otázky. Jedním z cílů předchozí části je zjistit kandidátovy silné technologické stránky. Říkám o sobě (ohledně pohovorů), že jsem hodný, ale spravedlivý. Takže se ho ptám na věci, o kterých říká, že je dobře zná. Samozřejmě, musím ty věci dobře znát i já. Ale vzhledem ke svému stáří a senioritě ;-) vždycky najdeme slušný průnik. Někdy se i kandidáta přímo zeptám: "Jaké jsou momentálně dvě Vaše nejsilnější technologie?".

    No a pak začneme na povrchu, u triviálních a základních věcí a jdeme hloub a hloub, až se někde naše znalosti zastaví - narazíme na lokální minumum. Pokud se to stane, nebo se téma vyčerpá, nebo pokud přes veškerou snahu zůstaneme stále na hladině, přejdu k dalšímu (silnému) tématu.

    Pro představu jak může tahle část vypadat, dejme tomu, kandidát říká, že dobře zná JPA, či Hibernate. Můžeme začít třeba otázkou "Na jakém principu tahle technologie funguje?", nebo "Jaký je vztah mezi JPA a Hibernate?".

    Pak se podíváme na mapování pomocí metadat. Můžou to být otázky typu "Které dvě anotace/XML elementy jsou nezbytně nutné, aby framework mohl používat (POJO) třídu jako entitu?", či "Které anotace při mapování běžně používáte?". Podstatné je, že nevyžaduji přesné názvy, ale jestli kandidát rozumí o čem mluví a principům, na kterých to funguje.

    A jdeme hlouběji - jaké mohou být vztahy mezi entitami, jaké jsou strategie pro získávání dat a která z nich je defaultní pro daný typ vztahu? Jak se řeší složené klíče? Na téhle úrovni složitosti často opustíme mapování entit a podíváme se na jiná zajímavá témata - přece jenom, děláme phone screen a času je málo.

    Můžeme si popovídat třeba o EntityManageru, nebo o Session. Pokud nám to spolu klape, můžeme se dostat až k transakcím, nebo co to je PersistenceContext a PersistenceUnit. Někdy dokonce dojde i na lifecycle entit :-)

    Ať už se dostaneme kamkoliv, je podstané, jak jsme si o tom popovídali. Už jsem zmiňoval, nejde mi o žádné odříkávání slovníkových dat a in-memory znalostí. Jde mi o porozumnění a rozsah, které by mělo odpovídat dané úrovni seniority. Jednotlivé otázky, jak úvodní, tak usměrňující vybírám intuitivně, nemám žádný mustr, podle kterého jedu.

    Když se čas nachýlí, je prostor pro kandidátovy otázky. Kandidát mi věnoval cca 25 minut svého času a tak je fér mu otevřeně zodpovědět, co by ho zajímalo. Možná si říkáte, že 5 minut na otázky není moc, ale většinou to bohatě stačí - moje zkušenost je taková, že nadpoloviční většina lidí nemá žádné otázky, nebo tak jednu dvě. Pokud je někdo zvědavější a má otázek víc, i já mu (rád) věnuji víc času.

    Zakončení

    Jakmile jsou otázky za náma, zbývá říct už jen dvě věci - co bude následovat a rozloučení. Co následuje po rozhovoru? Za pomocí svých poznámek (viz dále) sepíšu jednoduché hodnocení s pozitivním, nebo negativním výsledkem, který se kandidát vzápětí dozví. Pozitivní skóre se rovná pozvání na osobní pohovor.

    Jak si píšu poznámky

    Když jsem s phone screeny začínal, psával jsem si poznámky přímo do vytištěného CV. Není to dobrý způsob - každé CV je jinak formátované, velikost bílých ploch na psaní je proměnlivá, je to neuspořádané atd. Jedinou výhodou je, že CV a poznámky jsou pohromadě.

    Časem jsem ale zakomponoval lepší metodu - přímo během pohovoru si kreslím mind mapu. Stejnou metodu pak používám i u osobního pohovoru (Je to konzistentní a dobře se v tom hledá). Výhodou mind mapy je, že si daleko lépe připomenete, o čem jste si povídali. A taky to lépe vypadá. Navíc, mind mapa se mnou zůstane - zpracovaná CV vyhazuji, ale mind mapy si schovávám a archivuji.


    Související články

    Software Engineering, má rozumné paralely?

    $
    0
    0
    Konstantou Software Engineeringu (SE) je jeho dynamika. Snad právě proto hledáme paralely a podobenství v jiných oblastech lidské činnosti - abychom lépe porozuměli jeho zákonitostem, uchopili jeho abstraktní nehmotnost a někdy ;-)  i jen našli pevnou půdu pod nohoma.

    Nejčastějšími doménami, kam se sahá pro inspiraci a popis jsou: "klasická" architektura a stavebnictví (stavíme sofware), strojní výroba (vyrábíme software) a automobilový průmysl (procesní a automatizovaná výroba od designu po prodej). Tyto paralely jsou hodnotné, protože umožňují průmět, projekci něčeho obecně známého do něčeho, o čem někdy tušíme pouze fuzzy obrysy.

    Auta, domy, nebo továrny?

    Tak jak jsou tyto paralely přínosné, tak jsou zároveň zavádějící. Což není nijak překvapivé - architektura má za sebou tisíce let vývoje. První automobil vznikl někdy v 19. století. Pokud bychom tedy chtěli srovnávat softwarový vývoj s automobilovým průmyslem, bylo by adekvátnější, kdybychom to dělali s fází, kdy ještě nebyl průmyslem. Tedy v dobách, kdy byly zhruba jasné požadavky, ale každý je implementoval po svém.

    Automobil Benz z r. 1885 (zdroj Wikepedia)

    Tehdy ještě nebyla žádná standardizace. Postupně vznikala unifikace, normy, automatizace, globalizace. Tyhle tendence lze také vysledovat i v oblasti SE. Ale pořád to každý dělá tak nějak po svém.

    Pokud máme k dispozici standardizované komponenty (třeba cihly), lze z nich skládat komplexní řešení. Ale nejen to - dá se také přesně spočítat (s rozumnou odchylkou) koncová cena, v návrhu se dají zohlednit jejich fyzické vlastnosti (např. stabilita cílového řešení) atd. Tohle všecno v SE chybí.

    Marnost, samá marnost

    Lidé z byznysu už dlouhá léta sní o tom, jak se bude software skládat z jednotlivých "krabiček" (= komponent), ale kromě marketérů, kteří se snaží taková řešení prodat, nejspíš nikdo nevěří tomu, že by to fungovalo.

    Z mojí zkušenosti se nejdál v tomto směru dostaly nástroje a systémy z oblasti SOA (a nijak překvapivě, hlavně ty komerční). Do určíté úrovně (abstrakce, či návrhu) lze řešení vytvářet "taháním kostiček a šipek". Ovšem od této hranice níž nastává, námi vývojáři běžně zažívaná, realita - ty "kostičky" je potřeba naimplementovat a to už jsme na poli klasického softwarového vývoje.

    Kompozitní aplikace v Oracle SOA Suite (zdroj Oracle)

    Samozřejmě, hodně by zde pomohla znovupoužitelnost. Ale ruku na srdce - už jste někdy viděli, že by reusabilita fungovala na úrovni komponent? Já teda moc ne. Obvykle bývá problém v governance - dozvíte se, že to není pořeba, není to ve scopu projektu, verzování je zbytečná práce navíc, řešení (zpětné) kompatibility je moc náročné atd. Takže řekněme, že... znovupoužitelnost je hezký, ale teoretický koncept. Zatím. Oni se to lidi časem naučí. Tak jako se naučili stavět domy a auta.

    Jiným problémem SE je, že se nezabývá jednou (byť třeba rozsáhlou) doménou, jako třeba stavebnictví, ale zasahuje v podstatě do jakékoliv oblasti. V takovém prostředí se pak velmi těžko extrahují nějaké principy, o které se lze opřít v příštích projektech. Proč asi agilní vývoj neslibuje nic konkrétního, ale spíš něco ve stylu "bude to kvalitní, budeme to neustále zlepšovat, ale nevíme přesně, co to nakonec bude" :-)

    Vanitas vanitatum. Byť se někteří z nás věnují SE celý svůj produktivní život a pokud zůstanou zdravými programátory, tak snad i zbytek života; tak z hlediska pomíjivosti je SE stále ještě v dětských letech (ne-li v plenkách). Třeba se za sto let naši potomci a následovníci ohlédnou zpět a budou nás litovat, v jakých krutých a nestabilních podmínkách jsme budovali svá díla. A po dalších staletích, až vznikne nové vědecké odvětví - softwarová archeologie - budou vzdálené generace stát v úžasu nad tím, co jsme dokázali vytvořit holýma rukama. (Anebo taky ne.)

    Má to smysl?

    Pokud se kruhem vrátím zpátky na začátek - má smysl hledat pro SE nějaké paralely? Myslím si, že ano. Pomůžou s porozumněním komplexních řešení a problémů, na které lidská mysl není designovaná. Ale je potřeba to brát s rezervou... software zkrátka nemá čtyři kola.

    Související externí články

    GeeCON Prague 2016, den 1

    $
    0
    0
    Letos jsem to nevychytal co se týče školení - prostě jsem to úplně vypustil - a tak jsem si řekl, že se aspoň trochu zahojím na nějaké konferenci. A protože jsem už pár let po očku sledoval GeeCON, resp. jeho pražskou odnož, padla volba na něj.

    A vybalím to na vás hned na začátku: Je to dobrá konference, stojí za to, na ni jít. Určitě mají (kluci polský) ještě co zlepšovat. Ale celkově je to přínosný - ať chcete držet prst na tepu doby (= bleeding edge), mít všeobecný přehled, co se v doméně děje, anebo najít inspiraci - to vše tady najdete v rozumně vyvážené symbióze.

    Keynote

    Keynote byly dvě - první sponzorská, do počtu, naštěstí jen 20minutovka a druhá, která se pro mne stala vrcholem dne.

    Next Gen R&D: craft vs. chop-shop

    Keynote Ondřeje Krajíčka (@OndrejKrajicek) ze sponzorujícího Y Softu byla krátká a... neinspirativní. Úplně jsem nepochopil souvislost mezi názvem a obsahem přednášky - možná v obsahu bylo něco o R&D, ale asi mi to uniklo. V podstatě šlo o to, že jako vývojáři jsme zároveň vědci, umělci i řemeslníci (scientists, artists/artisans, craftsmen) a že učednictví, jako způsob výuky, je s námi spousty (stovky) let.

    Become a Polyglot by learning Java!

    Keynote Jaroslava Tulacha (@JaroslavTulach) nejlépe shrnuje následující tweet:

    Nadšení bylo na místě, takhle má prostě vypadat správná key note - nemusíte se nutně posadit na zadek, ale nějaký wov! moment by tam měl být. A to se tady podařilo.

    Během 50 minut, představil Jaroslav dvě věci: Graal VM a Truffle. Graal je nová virtuální mašina, která se integruje s HotSpotem (prý stačí jen na classpath "upustit" Graal JAR), která umožňuje běh různých jazyků - JVM i ne-JVM (resp. ne jejich JVM, ale nativní implementaci), třeba JavaScript a Ruby.

    Toho se týkala i všechna tři dema. V prvním šlo o zavolání Ruby metody z JavaScriptu (nebo naopak?). Druhé demo ukazovalo jakýsi cross-debugging: prostě debugguju, debugguju, jsem v Ruby, ještě chvilku debugguju a jsem v JavaScriptu. A vidím šechno, proměnný atd. Cool, hustý, hustokrutý. Třetí demo jsem myšlenkově trochu vypustil, ale myslím že šlo o Node.js.

    Jestli jsem to správně pochopil, tak Truffle je nástroj na psaní vlastních jazyků, který pak můžou běžet v Graalu a rovnou mají dobrou performance. Co dobrou, jsou rychlý jak sviňa. To byla taky jedna z věcí, kterou Jaroslav předváděl/říkal - že Graal VM má lepší performance, než HotSpot (v případě Javy), nabo nativní implementace Ruby. Ukazoval to na prográmku, který implementoval Eratosthenovo síto.

    Věc, která mě zaujala, když Jaroslav zmiňoval problematiku JVM a dynamických jazyků: vývojáři zaměřený na aplikace (např. NetBeans) preferují staticky typované jazyky. Naopak vývojáři zaměřený na data (např. astronomové) preferují dynamické jazyky. Na tom by něco být mohlo (i když pro mě to neplatí - vzdycky jsem dělal aplikace, a začínal jsem na dynamických jazycích, takže (ne)existenci typů neřeším).

    Čtvrtek

    Celkově hodnoceno, první den GeeCONu byl slabší, než ten následující - vyjma Graal/Truffle key note a přednášky o graph DB, šlo o průměrné přednášky. Ne nezajímavé a určitě ne ztráta času, ale přeci jen... slabší.

    Who's Afraid of Graphs?

    Přednáška Davida Ostrovskyho (@DavidOstrovsky) o grafových databázích pro mne byla toho dne nejzajímavější a nejpřínosnější. David je určitě velký fanoušek filmu Spaceballs, jímž vydatně špikoval demo, a filmů Mela Brookse. A taky se podílí na vývoji Couchbase, což je dokumentová NoSQL databáze. Nicméně tentokrát hovořil o "konkurenci".

    Zajímavá byla hned úvodní myšlenka - NoSQL databáze jsou s námi cca 10 let. Relační DB zhruba 40 let. Ale grafy jsou s náma minimálně 300 let. Mimo jiné zmiňoval matematický problém Seven Bridges of Königsberg, kterým se zabýval Euler v 18. století.

    David zmiňoval use casy pro využítí grafových databází a zároveň uvedl a hned zavrhl nejčastější případ - sociální sítě. K tomu hned za chvíli. Dalšími příklady užití jsou authorizace a herní ekonomiky (game economies). A obecně případy, kdy jde použít "statické dotazy".

    Proč nepoužívat grafové databáze pro sociální sítě? Protože neškálují. Doslova "graphs don't scale". Procházet celý graf pro každý dotaz? To asi Facebook nedělá. Co s tím? David doporučoval dvě věci: Za prvé sharding. Sice to pořád neškáluje, ale je to lepší než nic. A za druhé, rozdělit data - mít grafová data v grafové databázi (např. Neo4j) a zbývající data v relační databázi (např. MySQL).

    Velkou část přednášky věnoval David praktickým ukázkám několika grafových databází. Začal tou nejpopulárnější, Neo4j a jejím dotazovacím jazykem Cypher. Cypher má specifickou notaci, kdy používá ASCII art pro reprezentaci patternů. Pro koho je Cypher moc exotický, může zkusit OrientDB, která používá SQL-like dotazování.

    Problematiku dotazování řeší také další nástroj: Gremlin, jazyk pro traversální dotazování grafů. Gremlin není svázaný s konkrétní databázovou implementací, ale pomocí blueprintů se může dotazovat nad libovolnou grafovou databází. Blueprint je analogie JDBC pro grafové databáze.

    Poslední ukázka se týkala Elasticsearch, kdy David ukazoval live Twitter analýzu (Hillary vs. Trump). Bylo to na mě hodně rychlé a efektní. Co mě zaujalo, možnost vytvářet virtuální grafy on-the-fly, podle momentální potřeby, tedy bez toho, aby dané vazby v datech existovaly.

    Ten Productivity Tips for Java EE and Spring Developers

    U přednášky Simona Maplea (@sjmaple) ze ZeroTurnaround nepřekvapilo, že na závěr zpropagoval dva jejich nástroje, nicméně nebylo to nijak násilné a do konceptu to zapadalo.

    Ohledně produktivity zmiňoval tři oblasti: komunikaci, správu tasků a nástroje. Komunikaci věnoval Simon minimum prostoru. V podstatě řekl, že komunikace je klíčová, mnohem náročnější, pokud je vzdálená (remote) a dobrým nástrojem pro distribuovanou komunikaci je Slack. Myslím si, že v reálném životě má největší přínos pro produktivitu právě komunikace, ale chápu, že se to na vývojářské konferenci špatně prezentuje.

    Doporučení ohledně správy tasků je přímočaré:
    • Optimizing current tasks
    • Removing non-essential tasks
    • Retaining positive (process, activities, tools etc.)

    Nejvíce prostoru věnoval Simon nástrojům a z nich nejvíce JBoss Forge. Tenhle nástroj mě zatím zcela míjel, takže jestli jsem to správně pochopil, jde o JBossí odpověď na scafolding. No, řekl bych, že v dnešní době celkem passé. Co mě trochu zarazilo - vzhledem k zaměření přednášky - že Simon v demu preferoval Maven před Gradlem. Buď si tu ukázku ulehčil, nebo tak trochu ztrácí na kredibilitě.

    Další nástroje zahrnovaly Arquillian (JUnit-like testování v kontejneru), TomEE (Java EE extension/profil pro Tomcat), Spring Boot (RAD(?) ve Springu) a konečně v úvodu zmiňovaný JRebel a XRebel. Výčet sice hezký, ale asi nic, co by seniorního vývojáře překvapilo. Osobně mě to neinspirovalo si ani jeden nástroj vyzkoušet.

    Shrnutí Simonovy přednášky znělo:
    • Care about your time
    • Don't lose sight of your goal
    • Explore productivity tools

    Apache Cassandra: building a production app on an eventually-consistent DB

    Oliver Lockwood se na úvod zeptal, kdo sleduje fotbal. A kdo sleduje Premier League. Oliver pracuje pro televizi Sky, která je držitelem licence na vysílání Premier League. Jak to spolu souvisí? Sky používá pro persistenci jejich Online Video platformy databázi Apache Cassandra.

    Cassandra je NoSQL distribuovaná databáze pro správu velkých dat. Z úvodu si pamatuju, že jeden node (náhodně vybraný loadbalancerem) je pro daný příkaz řídící pro zbytek clusteru. Pro databázi se definuje replication factor, tj. kolik kopií záznamu chci mít na jednotlivých nodech. A že při synchronizaci vyhrává poslední zápis (last write wins).

    K čemu není Cassandra dobrá? Pokud potřebujete komplexní dotazy, nebo něco jako RDBMS transakce. A co může být na Cassandře problematické? Synchronizace času mezi jednotlivými nody. Co s tím? Buď používat synchronizační timestamp na straně klienta, nebo se "časově citlivým" (time-sensitive) dotazům vyhnout.

    Poslední část přednášky byla o rozvoji DB schématu. Ve Sky si na to napsali vlastní nástoj cqlmigrate, dostupný na GitHubu. Nástroj napomáhá automatizaci, může provádět přírůstkové změny na jednotlivých nodech.

    Machine Learning by Example

    Pro mne nejslabší přednáška tohoto dne. Téma prezentované Michałem Matłokou (@mmatloka) bylo sice zajímavý, ale asi nešťastně zpracovaný. Předně, věnoval příliš mnoho času úvodu do tématiky, což nejspíš bylo zbytečný - každý, kdo měl aspoň trochu podobný předmět na škole (u nás se to jmenovalo "Expertní systémy") se asi trochu nudil.

    Takže use casy - rozpoznání hlasu, detekce obličeje, analýza podvodů (fraud analysis), self-driving cars. Typy učení - supervised, unsupervised, semo-supervised a reinforcement learning. A citát z Alana Turinga.

    A pak, bez nějakého přechodu, skok rovnou do dema, kdy jsem nepochopil, co se děje. Ukázka byla založená na použití nástrojů Apache Spark a Zeppelin, ale neptejte se mě, jak spolu souvisí. Demo bylo dlouhé a já jsem se v prvních 5 minutách ztratil, takže jsem zbytek přednášky protweetoval.

    Definition of Done: Working Software in Production

    Poslední čtvrteční prezentace (kterou jsem absolvoval) od Thomase Sundberga (@thomassundberg), byla přesně ten typ přednášky, který nesnáším:
    1. Vyberete si podle anotace,
    2. Přenáška začne
    3. Cca v půlce si říkáte, o čem to vlastně je,
    4. Podíváte se znovu (stále během přednášky) do anotace, abyste si připomněli, na co jste to šli
    5. a cca 5 minut po přednášce vám dojde, jak spolu souvisí titul a obsah.
    6. Jenže tu není žádný aha! moment, protože nic tak nového jste se nedozvěděli.

    A přitom to vlastně tak špatná přednáška nebyla. Takže o co šlo? Continuous Delivery. A co že je tím DoD? Váš software v produkci. A teď, jak na to:
    • Převezměte kontrolu nad buildem - musí být triviální spustit build lokálně jedním příkazem.
    • Všechno verzujte - tady se to trochu rozjíždělo s tím, že dávali na produkci SNAPSHOTY (už se nepamatuju proč).
    • Automatizujte testování.
    • Procvičujte (practice) - prvně v testu, pak na produkci.
    • Perfect is not a place, it is a direction.
    • A hlavně: Začněte s málem a vydržte. Každé zlepšení se počítá.

    No a pak vám s tím, samozřejmě, pomůžou nástroje. V Thomasově případě to byly: Git, Jenkins, Puppet, Gradle, RPM a JFrog.

    Pátek

    Vzhledem k tomu, že jsem se slušně rozepsal, rozlomil jsem článek ve dví. Mé dojmy z pátečního GeeCONu si můžete přečíst na odkazu GeeCON Prague 2016, den 2. (strpeníčko... dejte mi trochu času to napsat ;-)

    Mind Map

    GeeCON Prague 2016 - Key Note, organizace a témata

    GeeCON Prague 2016, den 1.

    Související články


    GeeCON Prague 2016, den 2

    $
    0
    0
    Zúčastnil jsem se dvoudenní Java vývojářské konference GeeCON Prague. Možná se mýlím, protože nemám potřebný rozhled a informace, ale GeeCON mi přijde jako momentálně nejlepší Java konference v Praze - má mezinároní spíkry (všechny přednášky v angličtině), slušné renomé a odpovídající podporu sponzorů.

    Pokud máte tip na jinou Java/vývojářskou konferenci (obdobného rozsahu), dejte mi vědět v komentářích, ať vím, kam vyrazit příští rok.

    Pátek

    O prvním dni konference jsem se rozepsal v článku GeeCON Prague 2016, den 1. Dnes budu pokračovat druhým, pátečním dnem, který se mi celkově líbil víc. Což může být subjektivní - mě udělaly radost dvě výborné přednášky o Clojure, z nichž jedna pro mne byla vrcholem celého GeeCONu.

    A kromě Clojure zde byla také výborná přednáška o Microservices a pokračování tématu Graal/Truffle.

    How to Bake Reactive Behavior into Your Java EE Application

    Přednáška Ondreje Mihályi (@OMihalyi) o reaktivním programování (RP) mne moc neoslovila, i když nebyla špatná. Přiznám se, poslední dva tři roky jsem nesledoval aktuální trendy, takže jsem možná vedle, ale tyhle rective* záležitosti mi přijdou jako momentální hype.

    V úvodu přednášky mi chybělo nějaké "zorientování se" pro ty z nás, co nejsme v reactive doma. Uvítal bych nějaké diagramy, který daný design osvětlí. A naopak bych oželel "programování ve slidech" (powerpoint programming).

    Jinak měl Ondrej rozumný přístup - používat RP tam, kde to má smysl a pomocí refactoringu ho aplikovat na stávající design. Toho se týkalo také demo: na počátku byla aplikace (tuším nějaké vyhledávání letů) napsaná v JSF a JAX-RS, v níž se sekvenčně, ve vláčku, volali tři webové služby.

    Během refactoringu došlo na zapojení WebSocketů a Event Busu v Payara Micro. S tou Payarou jsem to moc nepobral - zrovna tady bych ocenil nějaký komponent diagram. Odnáším si z toho, že Payara tam byla hlavně kvůli CDI Event Busu. Pokud to tak bylo, tak v realitě by stálo za to tam mít něco event-minimalistic, případně použít služby aplikačního serveru (pokud je poskytuje).

    One VM to Rule Them All

    Přednáška Jakuba Podlešáka (@japod) a Jana Štoly pokračovala v tématu čtvrteční key note - Graal VM a Truffle. Pánové to měli sladěný nejen tematicky, ale i outfitem, zkrátka bylo hned jasný, kdo dělá v Oracle Labs:

    Obsahově byla přednáška zajímavá, ale pro mne ne moc záživná - přece jenom, kompilery a podobná havěť byly pro mne na škole jen nutné zlo. Takže byť stromy jsou velmi zajímavá algoritmická struktura, tak vytváření a manipulace AST velká zabava není.

    Kluci se v prezentaci střídali, což trochu rozbilo plynulost a soudržnost. Začali prezentací Graalu a tím, jak rychle v něm běží jazyk R. Zkrátka R jako Rychle :-) Pak bylo něco o symbióze R a JavaScriptu (import funkce z jednoho jazyka do druhého).

    A pak přišlo to AST... teda Truffle. Přiznám se, že po těch pár týdnech se mi toho už dost vykouřilo z hlavy a to i když se dívám do mind mapy (viz níže), kterou jsem si psal. Takže v krátkosti, viděli jsme jak napomoci parsování pomocí anotace @Specializaction a parametru guards. Pak tam bylo taky něco o optimalizaci a partial evaluation. No, a víc už vám k tomu neřeknu.

    Thirty Months of Microservices. Stairway to Heaven or Highway to Hell?

    Jednoznačně největší show celého GeeCONu. Holanďan Sander Hoogendoorn (@aahoogendoorn) to umí pořádně rozjet! Už jenom to, že jako cizinec je schopný do své prezentace naprat několik (smysluplných) slidů z A je to!

    Sander začal obligátním "monoliths are bad", aby pak pokračoval bojovými zkušenosti z implementace microservis. V jedné větě by se jeho příspěvek dal shrnout: "microservices are not easy".

    Sanderovi zkušenosti se  dají shrnout do následujících bodů:
    • Microservices require evolutionary architecture.
    • Start with guiding principles - implement business process, avoid transactions, components own their own data/storage.
    • RESTfulness is not easy - Postel's Law, have conventions (e.g. URI).
    • Testing - everything, fail quickly, automation, contract testing (JBehave).
    • DevOps is not easy - Infractructure as Code.

    Hlavní poselství přednášky? Tak samozřejmě rozumné "microservices are not for everyone". Rozumné proto, že cca poslední 3 roky se s microservices roztrhl pytel - prostě klasický hype (naštěstí už to opadá) - a opět to není žádná silver bullet.

    TDD: That's not What We Meant

    Zklamáním pro mne bylo vystoupení Steva Freemana (@sf105). Steva mám zapsaného jako spoluautora frameworku jMock, bohužel, dnes už mrtvého, který jsem měl hodně rád (verzi 2). A také jako spoluautora oceňované knihy Growing Object-Oriented Software Guided by Tests. Takže jsem čekal hodně.

    Steve byl jeden z mála nativních anglických speakerů (je z Londýna) a jak to tak někdy bývá, nebylo mu vůbec rozumět. Mám na akcenty docela ucho, ale řeknu vám, zlatý irský, nebo skotský akcent :-)

    Zklamaný jsem byl hlavně proto, že Stevova přednáška byla nudná, unylá. A přitom tam bylo pár skrytých rubínů a smaragdů. Třeba o profláknuté slavné knize Kenta Becka Test Driven Development:

    "It's worth re-reading. Nothing much there for the 1st read. But, so much there... after couple of years!"

    Steve hodně kritizoval praktiku, kdy se testy dělají jen na oko - "Look, we have tests!". Nazýval to "Test-Driven Theatre".

    Nejvíc se mi líbil tenhle slide:


    Doing Data Science with Clojure: the Ugly, the Sad, the Joyful

    Přednáška Simona Belaka (@sbelak) pro mne byla příjemným překvapením. Prezentaci jsem si vybral hlavně proto, že mám pro Clojure slabost (i když ho už pár let zanedbávám).

    Simon mluvil o Clojure hlavně ve vztahu k Data Science. Proč je Clojure v této doméně ideální jazyk? V Data Science jsou různé oblasti, požadavky a většina používaných jazyků je řeší jenom částečně.

    Infrastruktura se dá dobře řešit v Pythonu, nebo ve Scale. Modelování zase v R, nebo (opět) v Pythonu. Pak tu máme čištění a přípravu dat. A nakonec - a zde Clojure exceluje - manipulace se strukturou. A Clojure pokrývá všechny tyto aspekty. No a samozřejmostí (u všech jmenovaných jazyků), je Live Programming, které poskytuje REPL.

    Dalším silným argumentem pro použití Clojure v Data Science je horká novinka: clojure.spec. Upřímně, neřeknu vám, co to je - budu si to muset pořádně nastudovat. Podle Simona se to dá použít na "dotazovatelný popis dat" (queryable data descriptions) a ve spojení s Apache Kafkou (distributed streaming platform) je to husto-krutý. Opět nevím, o čem píšu, je to na mne moc raketová věda. Teda datová.

    Na závěr byly dvě zajímavé otázky z publika. Zaprvé, jak je na tom Clojure s unit testy. Odpověď - Clojure není TDD-oriented. Což mimochodem říkal už tvůrce jazyka Rich Hickey, který daleko radši debugguje. Mnohem vhodnější je spec.

    Druhá otázka se týkala toho, jak se naučit Clojure. Odpověď mi přišla brilantní - na Clojure se dá dívat jako na funkce v Excelu. Takže v prvním kroku si zkusit problém "naimplementovat", či ukázat v Excelu a pak totéž jako funkci v Clojure. Jednoduché, geniální.

    Clojure, clojure.spec and Beyond

    Pozor, famfára, tum tu du dú!! A cena za nejlepší přednášku jde za Carin Meier (@gigasquid). Za mne jednoznačně a bez diskuze. Moc pěkně provedená, moc pěkně přednesená a zatraceně zajímavá.

    Carin je autorkou knihy Living Clojure, dle svých slov píše v Clojure na denní bázi a Clojure v jejím podání je ten nejvíc cool a sexy jazyk, na který letos narazíte... víc cool & sexy už je jen clojure.spec. Ehm, použil jsem právě v jedné větě 4x slovo Clojure?!?

    No, dost chvály. O čem že byla ta přednáška? Carin si vzala za základ dětskou knížku Doktora Seusse One Fish Two Fish Red Fish Blue Fish a pomocí clojure.spec se jala čarovat. Programy jako stvoření, která se geneticky vyvíjejí.

    Kdo někdy trochu přičichnul k Lispu a podobné havěti, ví, že code is data and data is code. To není nic nového, ale clojure.spec to posouvá na úplně jinou úroveň - můžete si generovat specifikace, které vám generují data, která mohou generovat další specifikace, přitom se modifikují a generují...

    A Carin to krásně umí podat. Část její přednášky si můžete přečíst na jejím blogu: One Fish Spec Fish.

    Asi jste si všimli, že v popisu téhle přednášky dost bruslím. Je to tak. I když se podíváte do mind mapy níže, uvidíte, že jsem si toho moc nezapsal. Ze dvou důvodů. Už jsem říkal, že to byla nejlepší přednáška? Bylo by prostě škoda si u toho dělat zápisky. A pak, bylo tam toho tolik, že je to výživné ještě na měsíce studia. O teď mě omluvte - jdu generovat testovací data, která se rýmují. (Mimochodem, všimli jste si, že two se rýmuje s blue?)

    New Java Literals for the Brave and True

    Na přednášku Lukáše Křečana (@lukas_krecan) jsem dorazil pozdě, vlastně až cca v druhé půlce, protože jsem se v předsálí zakecal s Carin Meier o clojure.spec.

    Takže jestli jsem to ze závěru pochopil, šlo o to, mít v Javě literály podobně jako ve Scale a Lukáš k tomu zneužil Javovské lambdy.

    Budu teď trochu ošklivý, nebo upřímný - šel jsem se na přednášku podívat, abych viděl Lukáše na živo. Protože - ruku na srdce - Scala je mi dost ukradená.

    Dirty Hacks with Java Reflection

    Závěrečná key note Heinze Kabutze (@heinzkabutz) mě minula. Možná to byla únava, po dvou dnech intenzivního vstřebávání informací, možná přeplněná mozková kapacita, anebo, po vrcholné přednášce Carin Meyer, už nic nemohlo být zajímavé. Zkoušel jsem to, ale po 10 minutách jsem sjížděl Twitter a pak jsem se, ještě před půlkou, sbalil a šel domů.

    To málo, co jsem v úvodu zachytil, byly klíčový slova Reflection, Java 9, Atomic a Concurrent.

    Organizace

    Tak, to byly přednášky. Nejen ty ale tvoří konferenci. Co organizace? Byl to můj první GeeCON a tak nemám s čím srovnávat. Jasně, srovnávat třeba s Google Developer Day by nebylo fér.

    V první řadě musím vyzdvihnout lidi z GeeCON, že se do toho vůbec pouští. Na téhle fan bázi, kdy za váma nestojí velká firma, to musí být velmi náročné, postavené na spoustě entuziasmu. I proto jsem tolerantnější.

    Organizaci přednášek se v podstatě nedá nic vytknout. Technika fungovala, časový rozvrh klapal a to je hlavní. Android aplikace s programem konference fungovala uspokojivě. Dostal jsem zadarmo jednu el. knížku od O'Reilly.

    Pak už to byly více méně drobnosti - třeba hostesky by mohly znát heslo na WiFi, anebo tak nezmatkovat (a lépe informovat) s konferenčním tričkem.

    Jednu velkou výhradu bych ale měl... catering. Koláčky ke svačině a džusy dobrý. Obědy docela slabota - dalo se to, ale hodně lidí nedojídalo. Ale kafe? To byl průšvih! Java konference a mizerný kafe?!? Do zákulisí samozřejmě nevidím. Co ale příště domluvit sponzoring s Doubleshotem?

    Shrnutí

    GeeCON je opravdu dobrá Java konference. Přednášky jsou zajímavé a aktuální. Rozsah je tak akorát a ambice odpovídají Praze. Pokud během roku nenarazím na něco zajímavějšího, rád se na GeeCON podívám znovu.

    Mind Map

    GeeCON Prague 2016 - Key Note, organizace a témata

    GeeCON Prague 2016, den 2.

    Související články

    Merge dvou tabulek v Pythonu

    $
    0
    0
    Aktuálně studuju na Coursera kurz Introduction to Data Science in Python a jak se to někdy hezky sejde, naskytla se mi v práci možnost to rovnou použít v praxi.

    Rozhodně nejde o nic světoborného - prostě potřebuju dát dohromady dvě tabulky, trochu pošolichat data a udělat hierarchický index. Asi by to šlo udělat i v něčem jiném a možná jednodušeji. Ale Python mám rád a je to zábava si trochu zablbnout.

    Následující zápisek je zdokumentování postupu, který by se mi mohl někdy v budoucnu hodit. Pokud jste někdo větší borec v Pythonu - tj. nepíšete v něm jen jednou za pár let, jako já - budu rád, když mi poradíte nějaké zlepšení.

    O co jde?

    Určitě jste se s tím už setkali. Máte určitý nástroj, od kterého byste čekali celkem jednoduchou funkcionalitu a on ji, z nějakého důvodu, nemá. Takže skončíte u exportu dat a nějaké externí úpravy.

    To je náš výchozí bod - máme dvě vyexportované tabulky, formát souboru v tomhle případě nehraje roli. Může to být CSV, Excel atd. Ty naše dvě vypadají takhle:

    Tabulka CSD.csv

    Tabulka RQS.csv

    Co je pro nás podstatné, obě tabulky mají vzájemnou vazbu přes sloupec "Related issues", který odkazuje na identifikátor záznamu v druhé tabulce (sloupec "#"). Co není na první pohled zřejmé, záznamy v tabulce CSD (zelené záhlaví) mají vazbu 1:N na záznamy v tabulce RQS (červené záhlaví). Pro úplnost, vazba je obousměrná, nás ale zajímá jen směr CSD -> RQS.

    No a potřebovali bychom z toho dostat tabulku, která vypadá takto (barevné rozlišení je pro přehlednost, který data kam patřily):

    Výsledná tabulka matrix.xlsx

    Povšimněte si v prvních dvou sloupcích hierarchického indexu ("CSD ID", "RQS ID"), který vyjadřuje vazbu 1:N.

    Jak na to?

    To, kolem čeho se točí výše zmíněný kurz a co jsem pro manipulaci s tabulkami použil, je knihovna pandas - open source nástroj pro datové struktury a datovou analýzu. Na svých stránkách píšou, že je easy-to-use a opravdu se s tím pěkně pracuje.


    Základním elementem v pandas je DataFrame, ekvivalent dvourozměrného pole (se spoustou vychytávek). První krok je, převést naše tabulky do DataFrame. pandas mají spoustu možností, jak načíst externí data, my použijeme metodu read_csv:
    import pandas as pd

    csd = pd.read_csv('CSD.csv')
    rqs = pd.read_csv('RQS.csv')
    Zpracovávaná tabulka může být rozsáhlá, co do počtu sloupců, a protože výpis DataFramu na konzoli se defaultně zalamuje, může se hodit příkaz pro vypnutí této možnosti:
    pd.set_option('display.expand_frame_repr', False)
    Data máme načtená, můžeme je začít upravovat. První na řadě je tabulka CSD. Potřebujeme udělat následující úpravy:
    • Rozdělit data ze sloupce "Subject" do dvou samostatných sloupců pomocí oddělovače "> ".
    • Smazat sloupce, které v cílové tabulce nepotřebujeme.
    • Přejmenovat sloupce, aby v cílové tabulce dávali větší smysl.
    csd[['CSD ID', 'Contract chapter']] = csd['Subject'].str.split(
    '> ', expand=True)
    csd.drop(['Category', 'Subject',
    'Assigned To', 'Target version',
    'Release', 'Related issues'], axis=1, inplace=True)
    csd = csd.rename(columns={'Status': 'CSD status'})
    Navíc uděláme jednu operaci, kterou budeme potřebovat později - přidáme si nový sloupec "numeric ID", podle kterého cílovou tabulku později setřídíme.
    csd['numeric ID'] = csd['CSD ID'].str.replace('-', '').map(int)
    Obdobné úpravy uděláme na tabulce RQS a můžeme se pustit do spojování. pandas nabízejí metodu merge, která funguje obdobně jako SQL join.
    matrix = csd.merge(rqs, left_on='#',
    right_on='Related issues', how='left')
    Dalším krokem je vytvoření hierarchického indexu:
    matrix.set_index(['CSD ID', 'RQS ID'], inplace=True)
    Následně setřídíme novou tabulku podle sloupce "numeric ID", který jsme si dočasně přidali v rámci úprav tabulky CSD. Sloupec po setřídění odstraníme. Smyslem téhle eskapády je setřídit tabulku numericky podle sloupce, kde jsou string hodnoty.
    matrix = matrix.sort_values(by='numeric ID')
    matrix.drop('numeric ID', axis=1, inplace=True)
    Teď si ještě seřadíme sloupce, abychom se v cílové tabulce dobře orientovali:
    cols = ['Contract chapter', 'CSD status',
    'Redmine ID', 'RQS description',
    'RQS status', 'Related issues']
    matrix = matrix[cols]
    A pozor! Finální příkaz... zapíšeme do Excelu, resp. jiného výstupního formátu. Máme hotovo.
    matrix.to_excel('matrix.xlsx')

    Kompletní skript

    Celý skript je k dispozici na Bitbucketu jako snippet: matrix.py.

    Jak nainstalovat pandas?

    Nejjednodušší způsob, jak nainstalovat pandas a další spřízněné knihovny (třeba NumPy a dokonce i samotný Python) je package manager Miniconda. Stačí stáhnout instalátor pro váš operační systém a pak nainstalovat pandas příkazem:
    conda install pandas

    Programátor -> Vývojář -> Software Engineer

    $
    0
    0
    Source: Wikipedia
    Jak léta jdou, přemýšlím kontinuálně o cestě, kterou jsem urazil a kam směřuju. Jeden takový pohled na část takové cesty naznačuje titulek.

    Dneska už jsem na té cestě dál - jsem v bodě, kdy už pár let "stavím" týmy. A byť nehledám lidi, kteří jsou mým odrazem - naopak, mám rád diverzitu a plánovaně, podvratně :-) ji aplikuju - podvědomě vybírám lidi, kteří na podobnou cestu aspirují a berou ji jako součást týmové kultury.

    Téma je pro mě zajímavé - jak čistě myšlenkově, tak i prakticky. Pokud pracujete s týmy, tak kromě těch technických věcí, řešíte taky záležitosti jako rozvoj lidí, jejich vzrůstající finanční očekávání, ohodnocení jejich technické a jiné seniority atd.

    Zároveň nebudu skrývat, že ne vždy se to podaří - přesvědčit, inspirovat lidi, že tohle je ta správná cesta. Občas vidíte potenciál, ale nepovede se vám dostat daného člověka z jeho bubliny. A někdy se prostě jen mýlíte a chybujete.

    Korintským

    Asociace, která mi naskočila, když jsem začal o tématu přemýšlet, pochází, možná překvapivě, z Bible - Pavlova listu Korintským. Je to taková ta pasáž, co se čte vždycky na svatbách... ale nebojte, nebudu vás zahrnovat láskou ;-) mám na mysli jinou větu:

    Dokud jsem byl dítě, mluvil jsem jako dítě, myslel jsem jako dítě, měl jsem dětské názory; když jsem však dospěl, s dětinskými věcmi jsem se rozloučil.1. Korintským 13:11

    Co mně přijde podstatné na tomhle citátu, je ten přechod - opuštění určité formativní fáze a přechod do další. A i když s tím občas bývají problémy, nejde o odvrhnutí předešlé fáze, naopak, ta by měla být integrována.

    (A jen pro jistotu, protože vím, jak jsou lidi chytlavý - výběrem citátu jsem nechtěl říct, že – obecně – třeba programátoři jsou dětinští. Jasně, že občas jsou, ale není to generalizace. Ale což, ať si každý odnese, co potřebuje.)

    Model

    Jednoduchý model, který popisuje naše téma, vypadá jako tři soustředné kruhy. A tak jako cibule, krystal, či perla, rostou postupně schopnosti našeho hypotetického programátora.

    Skill model

    Programátor

    Znáte termín code monkey? Je to většinou nelichotivý termín, i když občas se k němu někdo hrdě hlásí (většinou nápisem na tričku). Mě se líbí definice z Urban Dictionary, která dobře vystihuje, co si pod termínem programátor představuju já:

    "A programmer who isn't actually involved in any aspect of conceptual or design work, but simply writes code to specifications given."

    Programátor je pro mne člověk, který - s ohledem na svou senioritu - dobře rozumí úzce vymezené technické oblasti. Hranice je zpravidla definována daným programovacím jazykem a v dnešní době také stále více nějakým přidruženým frameworkem. Cokoliv za algoritmy, technickými aspekty jazyka a lokální kompilací (je-li potřeba), je mimo oblast zájmu a zodpovědnosti programátora - jeho práce končí komitem do verzovacího systému.

    Taková úzce vymezená specializace nemusí být na škodu - záleží, jaká je vaše doména, role v týmu, rozsah projektu ad. Na druhou stranu, moderní softwarový vývoj vyžaduje daleko komplexnější spektrum schopností a mít v týmu "pouhého" programátora pak často znamená více zatížit ostatní členy týmu a  přenést na ně část činností, jež u programátora "padají pod stůl".

    Vývojář

    Vývojář je už o úroveň dál. Že dobře rozumí svému programovacímu jazyku, je samozřejmost. Stejně tak dobře ovladá sadu souvisejících knihoven a frameworků, jež tvoří jeho technickou doménu.

    Jako velmi volný příklad si představme mlhavý termín Backend Developer. Umí asi nějakou "business logiku", řekněme v případě Javy někdo s CDI/EJB, nebo Spring+AOP+Transakce, plus nějakou tu persistenci, tudíž JPA/Hibernate/MyBatis/JDBC. A trošku té security.

    Takže to je samozřejmost. Ale je to ještě něco navíc - větší, či menší povědomí, jak to spolu souvisí, nejen interně, ale i za hranice toho "backendu". Plus troška "toho designu" a zase - jak na úrovni kódu, tak na úrovni komponent.

    No a pak... pozvolné přibližování se k oblasti SW inženýrství: vědět něco o buildování, možná i nějaký ten release management, něco praxe a teorie testování (aspoň unit a functional), source code management, issue tracking, atd.

    To hlavní, co odděluje vývojáře od programátora? Schopnost vidět v technické oblasti "big picture".

    Software Engineer

    A co SW inženýr? Ovšem, je to dobrý vývojář. Ale ovládá také většinu souvisejících oblastí, potřebných pro kvalitní a moderní vývoj softwaru:

    Ale v první řadě - a to už je moje velmi subjektivní spekulace - rozumí byznisově tomu, proč daný úkol dělá a proč ho dělá daným způsobem (což je, vzhledem k mé zkušenosti, velmi, velmi vzácné). Přece jenom, je to inženýr a jeho prvotním úkolem je řešit problémy. Reálné problémy.

    Jediná cesta?

    Na internetu a v knihách se vedou dlouhé diskuze, co je a co není SW inženýrství, ba, jestli vůbec něco jako SW inženýrství existuje. Moje zkušenost je, že na každém projektu je potřeba vždy a znova vybudovat terminologii. Význam a kontext konkrétního termínu se neustále proměňuje a podstatné je, abyste si s kolegy v týmu rozuměli.

    Pro mne je software inženýr období a stav, kam jsem se dostal po téměř 20 letech programování. Šel jsem po výše naznačené cestě. Ta vaše bude zcela určitě jiná. O cestě, co jste urazili můžete vyprávět, ale zkušenosti jsou jenom vaše.

    Je to realistické?

    Samozřejmě, život není o zjednodušujících modelech a ideálních okolnostech. Skutečný svět je špinavý, divoký a ne-soustředný. V realitě tak vidíme spoustu prolínání vyše řečených rolí, jež se častokrát mění v čase i v rámci krátkého období, jako je třeba iterace, nebo projekt. A pak, existuje spoustu odlišností, jež nejsou výjimkami, ale spíše úplně jinými koncepty a přístupy. Diverzita života se mi vždycky líbila.

    Jak dělám Java pohovor IV: Java workshop

    $
    0
    0
    Zcela bezkonkurenčně nejčtenějším zápisem na mém blogu je opus magnum Jak dělám Java pohovor. Jeho čtenost je řádově vyšší, než u zbytku veškerých textů. Ten článek už je skoro pět let starý a neodpovídá (mojí) realitě.

    Věci, které za to stojí, se snažím vylepšovat, takže je v důsledku dělám jinak. A pokud máte to štěstí, že si můžete vybírat lidi k sobě do týmu, tak by vám na tom mělo záležet. Hodně. A tak si ty poslední tři, čtyři roky říkám, že bych měl svůj zápis zaktualizovat. Jak tedy dělám pohovor dnes?

    Agenda Java interview

    Agenda pohovoru zůstala hodně podobná:
    1. Představím se já.
    2. Prostor pro otázky kandidáta a/nebo představení společnosti, business domény, našeho oddělení a projektů.
    3. Diskuze nad kandidátovým projektem.
    4. Review kandidátova kódu.
    5. Java workshop
    Drobnou změnou je bod číslo 3, diskuze nad kandidátovým projektem. Velkou a stěžejní změnou je pak titulní Java workshop.

    Diskuze nad kandidátovým projektem

    Dříve jsem v tomto bodě probíral kandidátovo CV, ale postupně se to vyvinulo v diskuzi nad konkrétní zkušeností. Přijde mi to zajímavější a přínosnější, než diskuze nad "suchou historií".

    (Mimochodem, kandidáti mají neuvěřitelně zažitou historizaci svojí praxe. I když jim opakovaně explicitně zdůrazníte, že nechcete slyšet chronologicky odříkanou pracovní zkušenost, většinou vás naprosto ignorují a spustí naučený kolovrátek. Hanba vám HR a head-hunteři!)

    V dnešní době se tedy ptám na projektovou zkušenost ve stylu:

    "Mohl byste mi popsat Váš poslední, nebo poslední úspěšný projekt? Zajímají mě hlavně technické aspekty - mohl byste mi popsat a ideálně namalovat architekturu, či design vašeho vybraného projektu? Dále by mě zajímalo, jak byl projekt řízen, jaké role se na něm podílely a jaká byla Vaše role? Co třeba nějaké disciplíny SW inženýrství? Release management? Source code management? Issue tracking?"

    Většinou se mi podaří kandidáta (přátelsky) přimět k namalování nějakého schématu na whiteboard. To má dva aspekty. Jednak se nad vizualizovanou architekturou/designem dobře diskutuje. A jednak poznáte, jak je na tom kandidát ohledně schopnosti vysvětlit technické věci, znalost modelování, uvědomění si "big picture", kontextu daného projektu a spoustu dalších věcí.

    Ilustrační příklad whiteborard architektury

    Java workshop

    Když jsem pozměněnou podobu interview vymýšlel, chtěl jsem něco, co bude co nejblíž způsobu, jakým bych chtěl, abysme v týmu pracovali. Tedy: komunikovali spolu a uměli diskutovat nad kódem a designem. A samozřejmě... psali kód, ideálně s unit testy.

    Začínám tím, že si s kandidátem sedneme vedle sebe a předložím mu - podle vybraného příkladu - následující obrázek (pro nadcházející odstavce, považujme za dané zadání návrhový vzor Observer):

    Class diagram návrhového vzoru Observer

    Zeptám se kandidáta, jestli zná UML a daný návrhový vzor. Pokud ano, tak ať jedno, druhé, či oboje vysvětlí. Pokud ne, řeknu nevadí a obojí vysvětlím já. Tahle část trvá krátce, většinou tak do pěti minut a jejím hlavním smyslem je porozumět zadání. A teď přijde to hlavní.

    Otevřu notebook a... ukážu kandidátovi "skeleton" projektu natažený v IDE. Vypadá to nějak takhle:

    Skeleton Java projektu v IDE

    Jak je vidět na obrázku, i na UML diagramu výše, v projektu jsou dvě rozhraní a dvě implementační třídy. Ty konkrétní třídy "implementují" metody z interfaců, ale jsou prázdné. Čili, jde to zkompilovat, ale nic to nedělá.

    Rozhraní a jeho prázdná implementace

    Malá vsuvka, pokud vás to napadlo - v tom IDE to mám připravený v Eclipse a v IntelliJ IDEA. Dřív jsem to měl připravený i pro NetBeans, ale pak jsem to přestal udržovat - za ty čtyři roky mi na pohovor nepřišel nikdo, kdo by chtěl v NetBeansech dělat.

    Zpátky k projektu. Kromě produkčního kódu jsou tam připravený - opět prázdný - třídy pro testy. Pokud by vás zajímalo, jak přesně ten startovní projekt v IDE vypadá, podívejte se na můj repositář na Bitbucketu: https://bitbucket.org/sw-samuraj/hiring/overview

    Vysvětlím kandidátovi strukturu projektu a řeknu něco jako:

    "Takže, tady máme prázdný projekt (pro návrhový vzor Observer) a zkusíme si ho naimplementovat. Pokud znáte, nebo jste dělal nějakou reálnou implementaci tohoto vzoru, můžete zkusit udělat ji. Anebo můžeme zkusit naimplementovat ten vzor jako takový, dejme tomu ukázkový příklad.

    Záleží jen na Vás s čím začnete, jestli s implementací, nebo s testy a já jsem tady proto, abych Vám pomohl v případě problému. A v průběhu toho, jak budete psát, se Vás budu ptát na některé aspekty Vašeho kódu.

    V projektu můžete cokoliv změnit, je zde jen jedno pravidlo - nesmíte nijak upravovat interfacy."

    A je to. Kandidát začne psát, já se dívám, občas se na něco zeptám. Když se nám to zadrhne, jemně kandidáta navnadím, nebo popostrčím. Občas něco do kódu napíšu i já sám.

    Každý kandidát je naprosto jiný. Někdo to celé vystřihne za půl hodiny i s pěknými unit testy. Někdo za stejnou dobu stačí vyrobit jednu metodu, která přidává prvky do kolekce. V průměru strávím touhle částí zhruba 40-50 minut.

    A je to. Interview krátce zakončím a rozejdeme se.

    Jak workshop vyhodnotit?

    V momentě, kdy workshop skončí, už mám většinou jasno, jestli chci mít kandidáta v týmu, nebo ne. Někdy jsem na pochybách a je lepší se na to vyspat, nebo prodiskutovat s někým nezúčastněným.

    Jinak vás asi zklamu - neprozradím vám žádné tajemství, jak z té cca hodiny programování udělat výsledek. Pro mne to byla dlouhá cesta, během které jsem mířil k jakémusi ideálu. Proto nepotřebuju nějaký checklist, abych věděl, jestli tam - s kandidátem - jsme, nebo ne.

    Pokud vám minulý odstavec nedává smysl, nebo mu nerozumíte a přesto byste chtěli vědět, jak worshop vyhodnotit, zkuste se inspirovat těmihle aspekty:
    • Jak kandidát komunikuje? Během vysvětlování zadání a během programování.
    • Jak efektivně pracuje v IDE? (Na oblíbené IDE se ptám ještě před pohovorem, takže by to neměl být stresující faktor, že programuju v něčem nezvyklém.)
    • Jak hezky/čitelně/čistě/efektivně píše kód?
    • Jak designuje/strukturuje metody, třídy, testy?
    • Jak píše testy? Jestli vůbec. A kdy? Předtím, potom, zároveň?
    • Zajímají vás nějaké seniornější aspekty? Klidně se můžete ponořit do věcí, jako je specifická implementace některého Java API, nebo třeba do Reflection API (fakt, vyplyne to úplně přirozeně).
    • Chcete si ověřit znalost konkrétní verze Javy? 6, 7, 8? Žádný problém, jde to.
    • Jak kandidát komunikačně a znalostně reagoval na navržené alternativy?
    Určitě vás napadne něco dalšího.

    Co už nedělám

    S odkazem na původní článek, bych vypíchnul věci, od kterých jsem upustil. V první řadě, už se nevrtám v CV. Ani před pohovorem, ani během. Životopis si většinou jen rychle proběhnu před phone screenem, jestli mě tam něco nezaujme - třeba jestli má kandidát zkušenost s (business) analýzou, architekturou, team leadingem apod. Prostě nějaký přesah za vývojařinu.

    A potom, už nedávám hlavolam. I když tahle část bývala celkem zábavná, tak jsem ji odstranil - když jsem před těmi čtyřmi lety nově definoval, jak bych chtěl pohovor pojmout, zaměřil jsem se na to, aby to bylo co nejbližší denní realitě. A tam prostě vývojáři mechanické hlavolamy neřeší. (Čest výjimkám.)

    Jak dál?

    Pohovor tímto způsobem dělám poslední čtyři roky a musím přiznat, že po té době je to pro mne už příliš velká rutina. Chce to změnu. Zatím čekám na inspiraci. Je možné, že tenhle článek čtete v přelomovém období - takže jestli se někdy potkáme spolu na pohovoru, dost možná, že bude vypadat jinak.

    No dobře, Java. Ale co .Net?

    Z minulých dvou let mám zajímavou zkušenost. Poprvé v životě mě potkalo štěstí, že jsem se stal mentorem. Jako tím opravdovým, kdy se vztah mentor-mentee"samovolně", organicky vytvoří. Pikantní na tom je, že můj mentee není Javista... je to .Neťák!

    No. Kromě jiného jsme spolu řešili také .Net pohovory. Z dnešního pohledu to vlastně nebylo nic těžkého - vzali jsme můj Java pohovor, vytvořili .Net workshop a bylo to.

    Podstatné je, že to výborně fungovalo a dnes tak máme úspěšný nový .Net tým. Zkušenosti zkrátka občas přijdou ze strany, odkub byste to nečekali.

    Předešlé díly


    Související články

    CAP Theorem

    $
    0
    0
    Byl jsem teď na pracovním pohovoru. Byl první a zatím ne poslední. Mám z toho takový dost rozpačitý pocit, ale o tom napíšu někdy příště. Zmiňuju to proto, že jsem z toho minimálně vytěžil téma článku.

    O co šlo? Bylo mi na závěr pohovoru doporučeno, že pokud bych postoupil do druhého kola, tak bych si měl určitě nastudovat CAP Theorem.

    Beru to jako příležitost a jelikož jsem zrovna četl výborný článek Techniques for Efficiently Learning Programming Languages, volím formu blog postu. A rovnou na rovinu říkám, že CAP Theorem je pro mne... ehm, theorem, teoretické tvrzení, se kterým nemám praktickou zkušenost. Takže budu rád, pokud mne v komentářích opravíte, nebo doplníte.

    CAP Theorem à la Wikipedia

    Začněme definicí z Wikipedie: CAP Theoremříká, že "pro distribuovaný počítačový systém je nemožné poskytovat simultáně více, než dvě ze tří následujících garancí:"
    • Konzistence (Consistency) - systém vrátí při každém čtení poslední zápis.
    • Dostupnost (Availability) - systém vrátí pro každý požadavek odpověď, nicméně bez garance, že jde o poslední zápis.
    • Tolerance rozdělení (Partition Tolerance) - systém zpracovává informace navzdory tomu, že došlo k rozdělení sítě (network partition), způsobené chybou komunikace mezi sub-systémy.

    Wikipedia dále říká, že "žádný distribuovaný systém není imunní proti síťovému selhání, tudíž rozdělení sítě musí být tolerováno. V případě rozdělení, tak nastává volba mezi konzistencí a dostupností."

    Zároveň je potřeba zdůraznit, že "volba mezi konzistencí a dostupností nastává pouze tehdy, pokud dojde k rozdělení; v ostatních případech není potřeba dělat kompromis."

    Tolik tedy Wikipedia. Samozřejmě, Wikipedia je skvělý začátek, kde začít hledat informace. Ale pak je lepší jít trochu blíže ke zdroji.

    CAP Theorem originál

    CAP Theorem byl původně prezentován Ericem Brewerem v roce 2000 na konferenci Principles of Distributed Computing, jako součást jeho key note Toward Robust Distributed Systems.

    CAP Theorem, původní slide (zdroj: Toward Robust Distributed Systems)

    Brewer tehdy prezentoval i další věci, které ho ke CAP Theoremu dovedly, a které nám dnes již přijdou samozřejmé. Třeba, že persistence v distribuovaném systému je složité téma, nebo rozdíl mezi ACID a BASE přístupem.

    ACID vs. BASE (zdroj: Toward Robust Distributed Systems)

    Pro mne nejzajímavější myšlenka celé key note zazní už na začátku: "Klasické distribuované systémy se zaměřují na výpočet, ne na data. To je ŠPATNĚ, výpočet je ta jednoduchá část."

    Persistent State is HARD (zdroj: Toward Robust Distributed Systems)


    CAP Theorem vědecky

    Brewer tehdy ve své key note prezentoval CAP problém, jako theorem, tvrzení bez (matematického) důkazu (tedy přesněji jako doměnku - conjecture). Důkaz platnosti theoremu na sebe nechal čekat dva roky, kdy dva vědci z MIT - Seth Gilbert a Nancy Lynch - prokázali platnost theoremu, pomocí formálního modelu, ve své tezi Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services.

    Při čtení tohoto dokumentu můžeme vidět určitý posun v chápání daného problému. Jednak se zde už nemluví o distribuovaných systémech, ale o webových službách. A pak je celý problém a jeho popis pozvednut na vyšší, abstraktnější úroveň. Za zmínku stojí asi hlavně dva modely, na kterých je důkaz postaven.

    První model používá asynchronní síťový model, který nemá žádné hodiny (synchronizaci času) a jednotlivé síťové uzly se tak musejí rozhodovat pouze na základě přijatých zpráv a lokálních výpočtů.

    Druhý model se více blíží reálnému světu - v částečně synchronním modelu (partially synchronous model) má každý node své hodiny, které mají všechny stejné tempo. Hodiny nicméně nejsou synchronizovány, takže můžou ukazovat různé hodnoty pro stejný reálný čas.

    V závěrečném hodnocení modelů se píše: "V asynchronním modelu, kdy nejsou dostupné žádné hodiny, je nemožnost výsledku (impossibility result) velmi silná: je nemožné poskytovat konzistentní data a to i tehdy, pokud povolíme návrat zastaralých dat v případě ztracených zpráv. Ovšem v případě částečně synchronních modelů je možné dosáhnout praktického kompromisu mezi konzistencí a dostupností. Většina dnešních real-world systémů je nucena pracovat způsobem, kdy vrací maximum dat po většinu času.

    CAP Theorem Re-visited

    Naše povídání by nebylo úplné, kdybychom se nepodívali, jak to bylo dál - už jsme všichni velcí kluci a holky a víme, že žádné "žili šťastně až do smrti" neexistuje.

    Ke CAP Theoremu se po 12 letech vrátil sám Eric Brewer v obsáhlém článku CAP Twelve Years Later: How the "Rules" Have Changed. Je to zajímavé čtení. Brewer tam - nijak překvapivě - říká, CAP Theorem byl velmi často nepochopen.

    Vezměme si například důkaz, zmíněný v předešlé sekci - sice je formálně a matematicky správný, ale je postaven jen... na dvou nodech. To přece není realita systémů, kterých se CAP týká.

    Jak říká Brewer: "Designéři systému by neměli slepě obětovat konzistenci, nebo dosupnost, pokud existuje rozdělení." Především je potřeba revidovat tvrdé pravidlo "2 ze 3". Jak v článku opakovaně zaznívá, vztah jednotlivých CAP aspektů je spektrum, nikdy to není binární. (Mimochodem, pokud jste si nevšimli, podívejte se ještě jednou výše na patičku slidu ACID vs. BASE - zaznělo to už tenkrát.)

    Převážná část článku je věnována strategiím, jak řešit rozdělení sítě a následné zotavení se. Například jednou z možností zotavení jsou kompenzace, klasický nástroj dlouho-trvajících transakcí. Další možností je rekonciliace pomocí verzovacích vektorů (version vector). Někdy každá část partition použije různou strategii a tedy akcentuje jiný aspekt, tj. někdy dostupnost, jindy konzistenci.

    Zotavení se z rozdělení (zdroj: CAP Twelve Years Later)


    Co si z toho odnáším?

    Bylo zábavné se teoreticky zorientovat v (momentálně) odlehlé oblasti mého oboru. Rád čtu a přemýšlím nad věcmi a zpracovat si to formou psaní je fajn. Na druhou stranu, nosnost a rozsáhlost dané oblasti pro mne zatím není tak přitažlivá, abych se pustil do nějakého praktického výzkumu. I když bych se třeba rád podíval na NoSQL databáze, které hodně těží z BASE principu.

    Takže? Na pohovoru to už příště budu sypat z rukávu. A taky se budu trochu kritickým okem dívat na ty, co se budou ptát... už nebudou v takové převaze. A brát to trochu s nadhledem - svět není černobílý... je to spektrum.

    Související externí články


    Externí zdroje


    Viewing all 81 articles
    Browse latest View live