Category Archives: Uncategorized

Povídání o čtyřech proměnných

Omlouvám se, že píší o takové trivialitě, kterou všichni znají. Občas mi ale připadá, že se na ni často zapomíná. Proto bude dnešní zápis krátký a budou v něm chybět odkazy na použité zdroje, protože to co budu psát, se snad každý dočte už ve slabikáři.

Vývoj software určují a omezují čtyři základní proměnné

  1. Čas – kolik času na vývoj máme
  2. Zdroje – kolik peněz, jaké nástroje, prostředky a hlavně lidi máme k dispozici
  3. Rozsah – kolik toho má výsledný produkt umět
  4. Kvalita – v jaké kvalitě to bude

Mezi těmito proměnnými platí následující exaktní vztah (vyjádřeno graficky)
Vztah proměnných
Čas a zdroje se snažíme tlačit k nižším hodnotám, rozsah a kvalitu naopak k hodnotám vyšším. Bohužel jsou mezi nimi ta ošklivá pérka, která nám znemožňují volný pohyb. Je důležité si uvědomit jednu důležitou věc. NENÍ MOŽNÉ ZVOLIT HODNOTU VŠECH ČTYŘECH PROMĚNNÝCH NAJEDNOU. Mohu zafixovat nejvýše tři z nich, čtvrtá je jimi plně určena. A ne, opravdu si nemůžete určit všechny čtyři. Ani když pěkně poprosíte. Když se pokusíte stanovit všechny čtyři, ona vám nakonec stejně alespoň jedna uteče.

Dokonce vám můžu říci která. Přeci ta kterou si budete nejméně hlídat. Často to bývá čas. To pak mluvíme o zpoždění projektu (slyšeli už jste někdy ten termín?). Ale obvykle to odnese popelka kvalita. Te se velmi těžko definuje a měří, tím pádem i hlídá.

Otázka na závěr, abych zjistil jestli jste dávali pozor: Co se stane s projektem, který má pevně ve smlouvě určenu cenu, rozsah a termín dodání? (Pozor, odpověď není tak evidentní jak se může zdát).

Odpověď:

Mohlo by se zdát, že nám nezbyde než přijmout kvalitu, která vyjde z proměnných zadaných ve smlouvě. Ale pozor, hodnoty dané smlouvou nejsou totožné s těmi o kterých jsem mluvil. Pokud nám zákazník určí termín dodání a rozsah, cenu obvykle určujeme my (a trh). Když ji určíme klasickým pravidlem „nejlepší odhad nákladů plus zisk vynásob dvěma a přičti půlku“otevřeme si manévrovací prostor v oblasti zdrojů. Můžeme se pak pokusit kvalitu vytáhnout nahoru přidáním zdrojů. Samozřejmě, za cenu toho, že zákazník zaplatí přemrštěnou cenu.

Využití iterativních metodik při kusové výrobě nábytku

Abstrakt: Tato případová studie si bere za cíl vyzkoumat možnosti aplikace iterativních metodik při kusové výrobě nábytku. Popisuje nedostatky využití vodopádového přístupu a možnosti zefektivnění výroby použitím iterativních metod.

Výzkumnému týmu pod mým vedením byl svěřen nadmíru náročný úkol – sestrojit na míru vyrobený botník. Pro vývoj byla zvolena vodopádová metoda.

Sběr požadavků

Ve fázi sběru požadavků byly sebrány následující požadavky:

  1. Vhodnost rozměrů – botník musí svými rozměry vyhovovat danému prostoru a obecným zvyklostem
  2. Shodnost barvy s přilehlým věšákem – zbarvení výsledného produktu musí být totožné jako u již používaného věšáku
  3. Velikost vnitřních rozměrů musí být taková, aby alespoň do jedné části bylo možné vložit dámskou zimní obuv o výšce 21cm.
  4. Možnost uzavírání – botník musí být uzavíratelný, aby se zvýšila jeho estetická hodnota
  5. Zvládání zátěže – musí být možné na výsledném produktu bez obav sedět

Na základě požadavků a průzkumu trhu bylo rozhodnuto, že dojde k vývoji vlastního řešení, protože žádný na trhu dostupný produkt nesplňoval uvedená kritéria.

Návrh

Na základě požadavků bylo přistoupeno do fáze návrhu a byl vyprodukován následující design:

Návrh botníku

Tento byl předložen zadavatelce ke schválení a po jeho odsouhlasení bylo možné přistoupit k další fázi vývoje.

Realizace

Při realizaci se začaly vyskytovat nenadálé problémy. Bylo zjištěno, že subdodavatel je schopen dodat komponenty o maximální šíři pouze 40cm. Tento fakt znemožnil možnost výroby uzavírací části, jejíž rozměry byly naplánovány na 47x50cm. Díky flexibilnosti vývojového týmu došlo k jednoduché změně návrhu. Byl navržen sokl, který sníží potřebnou výšku uzavírací části na potřebných 40cm. Došlo tedy k změně návrhu. Tímto krokem se už celý projekt začal odchylovat od zvolené metodiky, která nepočítá s možností změny návrhu ve fázi vývoje.

Po skompletování a povrchové úpravě základního modulu se projekt setkal s dalšími obtížemi. Protože byl tento typ projektu pro vývojový tým nový, zjistilo se, že mu chybí dostatečné zkušenosti a žádný z jeho členů neumí vypočítat potřebnou šířku uzavírací části. Tu ovlivňuje množství proměnných jako je šířka samotného botníku, rozestup mezi oběma částmi zavírací části a typ dveřních závěsů (nesprávně pantů).

K další odchylce od zvolené metodiky došlo z důvodu skluzu v termínu. Zadavatelka se vrátila z inspekční cesty v tuzemském pohoří a viděla produkt v průběhu vývoje. Netuše, že tím narušuje metodiku, začala poskytovat zpětnou vazbu. Všimla si například, že je výrobek v zadní části otevřený a vznesla obavu, že používáním dojde k znečišťování povrchu zdi. Byl proto vznesen požadavek na úpravu návrhu tak, aby k obdobným potížím nedocházelo. Protože je tento zákazník pro náš tým důležitý, nebylo možné použít standardní procedury pro change request a požadavek musel být zapracován. Naopak, po informování o obtížích při výrobě uzavírací části nám bylo sděleno, že tento požadavek není nikterak kritický a není nutné ho dodržet.

Po implementaci krycí zadní části byl produkt hotov, úspěšně otestováno splnění všech požadavků a nasazen do používání (viz. foto)

Výsledný produkt

Diskuze

Viděli jsme, že zvolená metodika není příliš vhodná při výrobě nového výrobku, se kterým nemáme přílišné zkušeností. Vývoj pomocí vodopádu je velmi obtížný pokud:

  1. Nemáme zkušenosti s oblastí v které se pohybujeme. Vzniká tím velké riziko, že mezi námi a zákazníkem vznikne nedorozumění.
  2. Není snadné zjistit všechny požadavky předem.
  3. Využíváme nové a neznámé technologie.
  4. Existuje riziko, že zákazník bude chtít v průběhu projektu měnit a rozšiřovat zadání.
  5. Není jisté, že zvolený návrh bude schopen vydržet všechny zátěžové testy.

Je zajímavé, i když vcelku logické, si všimnout, že na většinu obtíží pří vývoji pomocí vodopádu narazíme až ve fázi realizace a předvedení zákazníkovi. Ve fázi sběru požadavků a návrhu obvykle k tomuto „střetu s realitou“ nedochází.

Navrhovaný postup

Po prostudování dostupné literatury, navrhujeme následující iterativní postup.

Při prvním kontaktu se zákazníkem se nevyhýbat sběru požadavků, zjistit co nejvíce o jeho představách a požadavcích. Pro první iteraci z vybrat nejdůležitější a nejrizikovější část. V našem případě by to byl základní modul botníku. U této části by proběhl návrh (s přihlédnutím na další rozšíření) a realizace opravdu nejnutnějšího minima. Doporučujeme například minimalizovat práci na povrchové úpravě. Po dokončení první fáze provést testovaní a vyžádat si od zákazníka zpětnou vazbu. Je důležité ho upozornit, že se jedná o první nehotovou verzi. Na základě jeho zpětné vazby potom volit obsah další iterace.

Přínosy iterativního vývoje

  1. Počítáme se změnou – nejsme překvapeni tím, že musíme do návrhu zavádět změny.
  2. Minimalizace nepotřené práce – v každé iteraci myslíme hlavně na práci pro současnou iteraci. Netvoříme věci, které možná nebudou vůbec potřeba.
  3. Minimalizace rizik – snažíme se nejrizikovější části přenést do co nejbližší části výroby. Když se při testech zjistí, že daný návrh výkonnostně nevyhovuje, je minimalizováno množství práce o kterou přijdeme z důvodu špatného návrhu.
  4. Brzký úspěch – již v od začátku máme něco, co můžeme předvést zákazníkovi. Tento fakt zvyšuje důvěra zákazníka a sebevědomí vývojového týmu.

Nedostatky iterativního vývoje

  1. Nutí zákazníka poskytovat zpětnou vazbu – někteří zákazníci se neradi podílejí na vývoji. Chtějí mít výrobek hotový, ale nechtějí do něj investovat svůj čas a práci.
  2. Není vhodný pro hromadnou výrobu – vyrábíme-li produkt hromadně (např. dodáváme kuchyňské linky) není vhodné postupovat iterativně. Zde je možné a doporučené použít vodopád.
  3. Při výrobě nábytku je obtížný refaktoring – v případě, že by nás nenapadl problém s maximální výškou dveří již při návrhu, museli bychom ho obtížně řešit v dalších iteracích.

Závěr

Ukázali jsme, že pro kusovou výrobu nábytku je možné použití iterativních metod. Je tu ovšem riziko zvýšení nákladů způsobené obtížným refaktorováním. V jiných odvětvích, kde je refaktorování levnější by byl tento způsob výroby zcela jistě vhodný.

Nedostatky JPA

Nenechte se zmást názvem, myslím si, že JPA je dobrý a užitečný standard. Nicméně je nutné mít na mysli, že je to jenom standard, tudíž s sebou nese všechny klady i nedostatky, které jsou se standardy obvykle spojeny.

JPA vznikalo v situaci, kdy bylo na trhu několik dodavatelů O/R mapovacích nástrojů. Mnozí z nich se i na jeho vývoji podíleli. Nemůže nás proto překvapovat, že JPA pokrývá jenom podmnožinu průniku funkčností, které existující nástroje umožňovaly. To co uměl například Hiberante oproti Toplinku se do standardu prostě dostat nemohlo. Platí to samozřejmě i naopak. V tomto článku, bych chtěl shrnout pár věcí, které mi v JPA chybí.

Vlastní typy (UserTypes , Custom types)

JPA umožňuje ukládat jenom následující typy:

Java primitive types; java.lang.String; other Java serializable types (including wrappers of the primitive types, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, user-defined serializable types, byte[], Byte[], char[], and Character[]); enums; entity types and/or collections of entity types; and embeddable classes

Na první pohled by se mohlo stát, že to stačí. Nicméně co dělat, když máme například položku typu java.net.URL a chceme ji uložit jako String? Pomocí JPA se vám ji podaří uložit jedině v serializované podobě. Zajímavou diskuzi k tomuto tématu najdete na TSS.


Criteria API

Criteria API je funkčnost Hibernate, které se hodí, když skládáme databázový dotaz za běhu. Například, pokud máme formulář pro uživatelsky definovaný filtr. Bez criteria API musíme skládat dotaz do řetězce jen proto, aby si ho mohl JPA provider vzápětí naparsovat a složit z něj SQL řetězec. To se mi zdá trochu postavené na hlavu.


Jednosměrné one-to-many vztahy bez join tabulky

Více na jednom z předchozích příspěvků. Například Toplink Essentials tyto vazby opravdu nepodporuje.

Zabíjení sirotečků (delete-orphan)

Umožňuje nám automaticky mazat prvky, které jsme odebrali z one-to-many asociace. Mám-li například třídu klient, která obsahuje kolekci adres, delete orphan mi zajistí automatické smazání adresy poté, co ji odeberu z kolekce. Jelikož JPA tuto funkcionalitu nepodporuji, je nutné adresy mazat ručně, což v některých situacích může být dost komplikované. Více se můžete dočíst v dokumentaci k Hibernate.


Nastavení pro ladění výkonu

Například BatchSize a další. Ladění výkonu je věc, na kterou obvykle v aplikacích typu HalloWord nenarazíte. Pokud ovšem budete psát reálnou aplikaci, bez těchto funkcionalit se neobejdete. A JPA vám kromě možnosti psaní si vlastního SQL mnoho pomoci nenabídne.

Další věci, které nejsou pokryty standardem, ale například Hibernate je umožňuje, můžeme najít na v dokumentaci k Hibernate Extensions.

A co nám z toho plyne? JPA udělalo velikou práci v tom, že sjednotilo metadata pro O/R mapování. Pokud vám nevadí psaní metadat v anotacích, určitě je dobré tento standard používat. Zajistíte si tím snazší přenositelnost na jiného JPA providera. Je ale nepravděpodobné, že se vám podaří napsat a provozovat aplikaci čistě v JPA, aniž by byla závislá na konkrétní implementaci. Pokud se tedy vzdáme iluze o snadné přenositelnosti, je podle mého názoru nejrozumnější používat JPA jenom na definici metadat. Pro DAO vrstvu bych už používal implementaci, na kterou už jsme tak jako tak vázáni. Tzn. v případě Hibernate by to byl Springovský HibernateTemplate, který mi umožní používat HQL a Criteria API.

A to je právě to krásné na JPA, nenutí mě brát všechno nebo nic. Dává mi svobodu vybrat si jak moc ho chci používat. Mohu si vybrat jestli ho chci „degradovat“ jen na formu zápisu metadat nebo jestli mi jeho omezení stojí za tu iluzi snadné přenositelnosti.