Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Test Driven Development - příběh nezbedného vývojáře

08.52 - 6. října 2012 | Moje práce

Lukáš napsal spot Pokud jde kód špatně otestovat, je špatně navržený, který mě donutil se zamyslet (občas to dělám). Zmyslet se nad tím, proč je u nás málo článků o TDD. Je to věc, která souvisí s přesvědčením. Obecně panuje přesvědčení, že psaní testů je práce navíc, že to prodlužuje dobu dodání, že je to peklo a nuda. Takové přesvědčení je hluboce zakořeněné a je velmi nebezpečné.

V podstatě to vypovídá o povaze takových stoupenců. Jsou to lidé, kteří jsou spokojení s tím co dělají, jsou to dříči. Nevadí jim opakovat dokola stále stejné chyby. Nevadí jim sedět v práci dlouho do noci, dělat víkendy nebo si tahat práci domů. Práce, kterou dělají je složitá a oni za to dostávají slušně zaplaceno. Tak to je. Proč něco měnit? Upřímně, já nevím.

Netvrdím, že všechen kód píšu tak, že si na něj nejdřív vytvořím testy. On je to i nesmysl. Někteří považují za TDD to, že napíšou 100 testů a k nim kód a mají hotovo. Blbost. Tohle je stejně špatný přístup jako nakreslit si to nejdřív v UML. Potřeba tvořit velkolepá díla do našeho řemesla nepatří. Musíme se naučit spokojit s málem. Pak možná zjistíme, že ty malé kousky, které dávají smysl, se dají zázračně propojit a najednou máme velký celek, který je často kvalitnější a funguje.

Nedílnou součástí dobrého návrhu je i prototypování. Prototypování je cesta jak prozkoumávat průchozí uličky. Důležité u prototypu je, že ten nikdy nejde do produkce. Nikdy! Ano, stálo to čas, ale získali jsme cenné zkušenosti. Teď je na čase sepsat si itinerář bodů, které chceme na cestě potkat a podle něj začít psát první testy a implementovat kód, který jimi prochází. Po malých krůčcích. Kochat se a hlavně uklízet za sebou. Na refactoring je čas v každém okamžiku. A vězte, že i když nevidíte, že by se něco dalo refactorovat, neznamená to, že by to nešlo.

Je důležité mít každou chvilku funkční kód. Je to neskutečně povzbuzující a člověk nepropadá často zoufalství. Má to obrovský dopad na produktivitu. Zoufalí lidé dělají zoufalé věci. Uchylují se pak snadno k prasečinkám a celé snažení posílají v prdel. Neježe pak nestíhají termíny, ale dodávají nekvalitní produkty. Spirála smrti. To, že chvátáte, neznamená, že jdete rychle. Určitě ne k cíli. Věřte mi, sám jsem si to několikrát prožil.

Můj příběh

Můj kód není dokonalý. Obsahuje chyby. Do produkce jsem hodněkrát nechal nasadit nefungující kód. Neotestovaný kód. V důsledku toho se třeba na celém Atlase ztratily všechny obrázky u zpráv. To není malá chyba. Je to celkem průser a taky nálepka, která se špatně strhává. To byl pro mne bod zlomu. Začal jsem se zajímat o to, jak něčemu takovému předejít. Hehe, ale pak přišla registrace do Atlasu Firem. Měl jsem měsíc na to, abych udělal nad technologií, která byla teprve v plenkách, produkt. To byla obrovská bolest. Neskutečné záseky. Jednou jsme se Steidou seděli nad pomalejma javascriptama do dvou do rána v kanclu. A zase to byl fail. Sice se to stihlo a běželo to, ale byly tam chyby a s tím kódem se nedalo dělat vůbec nic. Tam probíhala magie.

V podstatě stejný kus kódu jsem za nedlouho psal znovu – registrace odkazů do katalogu. Tentokrát řízený pomocí testů. Trvalo to asi stejně, možná o týden o dva dýl (testovat jsem se teprve učil, s tím i inversion of control a MVP pattern). Kód obsahoval asi jednu chybu. A za výsledek se ani po pěti letech nestydím. Mám k němu spousty výhrad, to ano, ale byl to dobrý kód. Pak jsem pomocí TDD psal i novou prezentační část, která tahala data jak ze starého katalogu, tak z nové technologie a věci, které jsem se na registraci naučil se mi náramně hodili.

Pak jsem trochu ztratil důslednost a začal testovat až potom. Byl jsem přesvědčenej, že dokážu dělat dobrej testovatelnej design i bez psaní testů předem. Taky jsem nechtěl nejdřív vytvářet ty šílený mocky. Hloupý jsem byl. Ano, testování je práce navíc a trvá to dýl. S tímhle přístupem rozhodně.

Přeskočím šedé období zamazané popelem a nedůsledností, přeskočím čtyři roky až do Hradeckého Code Retreatu. To byl můj první Code Retreat, kde jsem byl jako plnohodnotný účastník. Už na GDCR jsem si pěkně zapároval s Danem Kolmanem v F#. Tam jsem zjistil, jak může vést TDD k zajímavému poznání a naučit se jazyk, který ještě moc neovládám. Zpátky do Hradce. Měl jsem tu možnost dělat dvě session v páru s Marianem. První session jsem byl dost mimo a docela ztracenej, ale pomalu se mi začínalo otevírat myšlení. Druhá session už byla fajn a celkem nám to šlo.

Pak jsem se rozhodl, že se musím vrátit k počátkům a přečetl si TDD by Example od Kenta Becka. Najednou jsem viděl, kde jsme s Marianem dělali chyby, naučil jsem se mnoha triků a hlavně osvobodil svou mysl. Přístupů k TDD existuje mnoho a každý z nich může být vhodný na jiný problém. Někdy je dobré držet se malých krůčků a být v krátké smyčce zpětné vazby (no to je dobré pořád), někdy ale můžu být ty krůčky klidně větší, ale až když se naučíte dělat ty malé. To máte jako když se učíte násobit.

Dneska píšu službu, která nemá zatím klienta. Skládá se z několika subsystémů a já vím že funguje, ikdyž jsem to zatím pořádně nezkoušel. :) Tuhle důvěru mi ale dodává 250 unit testů a 60 integračních testů. Volím různé strategie. Někdy píšu čistě TDD, někdy prototypuju. Prototyp mi pak slouží jako vzor pro TDD, protože už vím, co chci udělat. Díky unit testům mám zhruba 90% code coverage. Je to díky filtrům. Protože mám z CC vyloučené věci jako adaptery kódu třetí strany, composition rooty a podobné. To jsou věci, který mi pokrývaj Integrační testy nebo jdou ověřit spuštěním služby.

Jsem v celkem raný fázi vývoje a tohle mi umožňuje věci měnit. Testy se mi neboří, protože nejsou zaměřený na detaily, ale na chování. Proto můžu věci měnit a hned (do 10 sekund) vím, jestli jsem něco nepodělal. Ještě před pár týdny jsem měl CC kolem 40 %. A tak jsem začal kód přestrukturovávat tak, aby se coverage zvedla. Žádná honba za spoustou testů. Tímhle způsobem jsem se dostal na 60 %. Pak jsem začal dopisovat testy tam, kde chyběly. Bylo potřeba upravit návrh, protože ty věci nešly moc dobře otestovat. Samozřejmě jsem odhalil několik chyb a vyloženejch blbostí. Ale teď mám 90% CC, méně chyb, lepší návrh a mnohem větší sebevědomí a vůli věci měnit.

Dopřejte to i sobě. Zasloužíte si to!

Je povoleno psát kód dvakrát

10.52 - 25. června 2012 | Moje práce

Ve světe pragmatických programátorů vládné všudepřítomné sucho (DRY), které rozlévají, kam až oko dohlédne. Jenže aplikovat jakoukoli poučku bez rozmyslu je cesta do sraček. :)

Již nějakou dobu si dopřávám odpočinku a mám dost času přemýšlet. Přemýšlím i tom, kde děláme jako vývojáři chybu. Proč je většina kódu špatná? Vždyť se snažíme ho udržovat čistý, trávíme týdny refaktorováním, jen aby byl kód fit, a hlavně se neopakujeme! Ano, neopakujeme, neopakujeme, neopak…

Repetitio mater studiorum

Tak určitě a je v tom pěkný bordel.

Už se vám určitě stalo, že jste celý den, dva něco psali, pak jste o to blbou náhodou přišli. Zálohy žádný. Co teď? Musíte to napsat znovu. A najednou vám to zabere jen hodinu nebo tři, ale ne celý den. Dokonce jste s výsledkem možná spokojenější. Čím to, sakra, je?

Vývojařina není psaní kódu! Jde o mix zkoumání problému, hledání jeho možných řešení, návrh výsledného řešení, samotná realizace a následné ověření. No, zní to trochu jako vodopád, ale někteří lidé potřebují sekvenční schema. Jiní na poslední tři (někdy i na všechny) použijí TDD.

Když, děláme CodeReatreaty, tak první session je určená právě na zkoumání problému a hledání možných řešení. Každý by se nad problémem měl zamyslet, dekomponovat ho na podproblémy a zkusit najít obrysy schůdné cesty. Na víc mu čas stejně nezbyde. Vzhledem k tomu, že je tam dalších 10, 15 lidí, kteří zkoumají ten samý problém a každý má jiný pohled na věc, vznikne z toho zajímavý den, proplněný různými implementacemi stejného problému. Kód se za každou session zahazuje a začíná se vždy načisto. Nové nápady, jak psát lepší kód, nejsou zadušeny starou implementací.

Důležité je se naučit zahazovat špatný kód. Opakovat se, psát ho znovu.

Většina softwaru trpí tím, že programátoři jsou spokojeni, když najdou jedno fungující řešení a jdou od válu. Celý den lepili kousíčky různě vygooglenýho kódu, aby vyřešili problém a teď by to měli zahodit? Ano! Víte, tohleto googlení a lepení je právě průzkumná fáze, kdy se tepreve učíte a nic dobrého z toho nevyleze. Pokud průzkumnou fází projdete s řešením, víte, že tudy cesta vede. Vraťte se na začátek a začněte se kochat. :) Sedněte si s někým do páru a použijte v klidu osvědčené techniky.

Kent Beck říká něco takového:

Není nic špatného na tom psát kód sám a bez testů, pokud zrovna zkoumáte zajímavý problém a hledáte, zda má vůbec řešení. Jakmile to řešení najdete, ok, víte, že cesta tudy vede. Smažte ten kód, sežente si partnera a napište to společně pomocí TDD.

A já s ním naprosto souhlasím.

A vám, teď probliklo hlavou, „ale můj PM s tím souhlasit nebude. Vždyť všechno píšu dvakrát, sežere to mnohem víc času.“ Kdepak! Pokud se shodnem na tom, že když píšeme kód podruhé, píšeme ho rychleji a lépe, tak to znamená, že příští průzkumničení bude díky menším překážkám rychlejší! Ve výsledku budete trávit možná stejně času, možná o málo víc, nad stejnými úkoly jako dřív, ale budete mít mnohem – mnohem – kvalitnější software. Nebo snad chcete dál odevzdávat makety a prototypy?

Pište kód dvakrát, ale nezanechávejte duplicity!

Tři přikázání TDD

14.29 - 25. prosince 2011 | Moje práce

Volně přeloženo z knihy The Clean Coder

  1. Nenapíšeš řádky produkčního kódu, aniž bys měl padající test.
  2. Nenapíšeš řádky testovacího kódu, pokud již nejsou aktuální řádky schopné projít (nezkompilovatelný kód také neprojde).
  3. Nenapíšeš řádky produkčního kódu, které nejsou nezbytně nutné, aby prošel aktuálně padající test.

K čemu vlastně TDD?

13.09 - 18. prosince 2011 | Moje práce

Na proběhnuvším CodeRetreatu jsme se a pány Kolmanem a Augustýnem balivi o tom k čemu vlastně je TDD, jaký má přínos?

Michal argumentoval tím, že dělá testable design a testy píše potom a že je s tím cajk, že nevidí důvod, proč dělat TDD. S Danem jsme nahazovali okřídleané pravdy o výhodách TDD, které Michal zašlapal. A tak jsme nenašli správnou argumentaci. A já o tom musel přemýšlet. Přece tam musí být nějakej zásadní rozdíl!

A on je. Ta největší devíza TDD je iterativní přístup k vývoji. Pakliže se držíte nějaké agilní metodiky a jednou za iteraci máte funkční produkt, který může jít potenciálně do produkce. S TDD jste v takovém stavu takřka každou chvíli (po dokončení kolečka Red-Green-Refactor). Kdykoli za vámi někdo přijde, že chce vidět jak na tom jste, tak nemusíte říkat „těd to nejde, zrovna mám něco rozdělanýho a nefunguje to.“ S TDD vám aplikace funguje takřka pořád. Sice nemá všechny požadované vlastnosti, ale je funkční.

Začal jsem cvičit TDD katu

10.02 - 27. prosince 2009 | Webdesign

Co je to za blbost, říkáte si.

Každý cvičí

Když se podíváte do jakékoli oblasti lidského působení, zjistíte, že všichni mistři pravidelně cvičí, aby se zdokonalovali nebo jen udržovali formu. Proč by programátoři měli být něco extra? I programátoři musí cvičit! Jen cvičením dosáhnete požadované formy.

Katy

Pro cvičení programátorů dnes vznikají různé katy (znáte z karate nebo juda), které jsou v podobě zadání, které byste měli zvládnout naimplementovat pomocí TDD za určitý čas. Cvičení takové katy by vám mělo přejít do krve, každý stisk klávesy by měl být zcela automatický a intuitivní, podobně jako se cvičí katy v karate. Abyste to vše stihli, musíte minimalizovat saháni na myš na úplné minimum. Musíte se naučit ovládat vaše vývojové prostředí a dostat z něj maximum. Musíte se naučit dělat věci co nejjednodušeji, ale výsledek musí být uspokojivě kvalitní. Čistý kód.

Hudba

U katy byste měli mít správný rytmus, aby vše odsejpalo jak má. Proto je důležitý výběr správné hudby, která udává rytmus a podporuje správné flow vašeho cvičení. Mnozí si vybírají nějakou klasiku, třeba Rachmaninova. Já si vybral taneční klasiku Pryda – Aftermath (Original Extended Mix), která má zajímavé progresivní pasáže a navíc trvá celých 15 minut. Na jedno 30minutové cvičení mi tedy vyjde poslech přesně 2×. Můj cíl, je dát celou katu na jeden jediný poslech.

Výzva

Když si vytyčíte nějaké cíle, musíte jim něco obětovat, sáhnout si na dno svých možností. Pojďte do toho také! Pojďte cvičit a staňte se mistry! Někteří budou nuceni doinstalovat lepší nástroje, které zvýší jejich produktivitu, jiní přijdou na to, že jazyk, ve kterém píší, je zdržuje a budou muset switchnout na produktivnější. :) Pojďte se poměřovat, každé ráno po cvičení hoďte svůj výsledek na štěbeták s tagem #tddkatacz.

Co cvičit

Já osobně začínám cvičit StringCalculator katu od Roye Osherova, ale je jich víc. Jsou tu katy na počítání prvočísel, výpočet výsledku bowlingu, převod římských čísel na arabská apod. Pokud se chcete inspirovat doporučuji navštívit stránky http://katas.softwarecraftsmanship.org/.