====== Zadání ====== * Proces vývoje SW. * Metodika Unified Process. * Agilní vývoj SW. * Fáze testování a typy testů. * Softwarové metriky, refaktoring kódu. Kvalita softwaru. * Odhadování nákladů a času vývoje SW. * Údržba a znovupoužitelnost. ====== Proces vývoje SW ====== Proces při němž: * **uživatelovi potřeby** * ⬇ transformovány na * **požadavky na software** * ⬇ transformovány na * **návrh** * ⬇ implementován jako * **kód** * ⬇ testován, dokumentován a certifikován pro * **operační použití** Základní aktivity při vývoji SW: * **Specifikace** * Je třeba definovat funkcionalitu SW a operační omezení. * **Vývoj** * Je třeba vytvořit SW, který splňuje požadavky kladené ve specifikaci. - Návrh - Implementace * **Validace** * SW musí být validován („kolaudován“), aby bylo potvrzeno, že řeší právě to, co požaduje uživatel. * **Evoluce** * SW musí být dále rozvíjen, aby vyhověl měnícím se požadavkům zákazníka. - Nasazeni - Vlastni evoluce - Servisovani - Phase-out (dožívání) **Modely životního cyklu** * Vodopád * Prototypování * Výzkumník * Spirálový model ===== OO modely ===== * **Vodopád** * celý projekt rozdělen do fází (trvající řádově měsíce): - analýza - návrh - implementace - integrace - verifikace - nasazení - údržba * chyba vede k návratu k předešlým fázím * ➖ odhalení chyby je čím dále dražší * ➖ těžké odhadnout ukončení fáze * testování neprobíhá současně s vývojem * ➖ chyby jsou odhalovány pozdě kvůli * **Iterativní** * celý projekt vyvíjen v několika iteracích * každá iterace obsahuje fáze jako u vodopádu (ale může se lišit intenzita) * ➕ rychlejší zpětná vazba od zákazníka * ➕ částečné řešení dříve * **Inkrementální** * jednotlivé části projektu vyvíjeny nezávisle a následně integrovány. * samotné část mohou být vyvíjeny další metodikou (vodopád, iterativně, XP,...) * ➕ vždy je výsledkem iterace použitelný produkt * Generická procesně orientovaná metodika postavená nad UML. * Definuje KDO dělá KDY, CO a JAK toho má dosáhnout. * **iterativní a inkrementální** * Každou iteraci lze chápat jako mini-projekt (fáze: Plánování, Analýza a návrh, Implementace, Integrace a testování) * **use-case driven** * Hlavní pohled udává Use Case diagram, snažíme se vždy dokončit jeden případ užití a pak pokračujeme dále. * **architecture-centric** * Jasně udává, že volba a vybudování dobré architektury systému je hlavním cílem projektového týmu. * **Řízení rizik** * Vyžaduje, aby se projektový tým zaměřil na řešení nejvážnějších rizik v rané fázi životního cyklu projektu (největší rizika jsou vždy řešena jako první). * Fáze v UP: * **Inception** * Definuje oblast projektu a business využití. * **Elaboration** * plán projektu, specifická funkcionalita, základní architektura * **Construction** * tvorba produktu * **Transition** * předání produktu zákazníkovi * Každá fáze má několik iterací s jasným plánem a výstupem. * Obsahují "workflows", různě zastoupené během celého vývoje. * requirements * Use Case model: use-case, sequence diagram * analysis * Analysis model: class/object diagram * design * Design model: class/object diagram, sequence, state, activity diagram * Deployment model: deployment, sequence diagram * implementation * Implementation model: component, sequence diagram * test * Test model: odkaz na všechny odpovídající modely a diagramy * Use-case spojuje workflows dohromady. {{:mgr-szz:in-gra:up_phases.png?600|}} * komerční implementace metodiky UP od IBM * RUP i UP stojí na stejném základu * RUP mírně detailnější než UP * drobné odlišnosti v syntaxi ====== Agilní vývoj SW ====== * Metodika zaměřená na lidi. * Umožňují rychlý vývoj a zároveň dokáží reagovat na změnu požadavků v průběhu vývojového cyklu. * velmi krátké iterace * UML pouze jako komplement * malé fungující týmy * zákazník zapojen do vývoje **Agilní metodiky**\\ * Extreme programming (XP) * Feature-Driven Development (FDD) * SCRUM Process Development * Test-Driven Development (TDD) http://agileManifesto.org * Individuality and interactions over processes and tools. * Working software over comprehensive documentation. * Customer collaboration over contract negotiation. * Responding to change over following a plan. Rozdíl oproti Model-Driven Engineering (MDE): * MDE: * pevná funkcionalita * variabilní čas a zdroje * Agile: * pevný čas a zdroje * variabilní funkcionalita ====== Fáze testování a typy testů ====== Proces spuštění (části) programu s cílem nalézt chyby. * Nemůže ukázat nepřítomnost defektů, může pouze ukázat, že v softwaru jsou chyby. * Testování také ukazuje funkce a výkon. * Ukazatelem kvality software. * //Testování je destruktivní činnost, není vhodné, aby vývojář a tester byla ta samá osoba.// * Verifikace - test proti vnitřní činnosti (unit testy) * “Dělat věci správně” * Validace - test proti specifikaci * “Dělat správné věci” Test je úspěšný, pokud zjistí přítomnost jedné či více chyb v programu. * **úplné testy** * prochází všechny logické cesty * není realizovatelné * **selektivní testování** * testujeme důležité logické cesty a cykly * validuje rozhraní a vytváří důvěru ve vnitřní činnost * **dynamické testování** * vzorkování -- provedení programu s předem určenými vstupy a porovnání s očekávanými výsledky * **BlackBox vs. WhiteBox** * vidím/nevidím do struktury programu ===== Typy testů ===== * **Unit testy** * hledají defekty uvnitř softwarových komponent a verifikují fungování softwarových komponent (např. modulů, programů, objektů, tříd, atd.), které jsou testovatelné samostatně. * **Integrační testy** * testuje rozhraní mezi komponentami, interakce s různými částmi systému jako jsou operační systém, souborový systém, hardware anebo rozhraní mezi systémy. * **Systémové testy** * Systémové testování se zabývá chováním celého systému/produktu, jak byl definován rozsahem vyvíjeného projektu nebo programu. * Měly by pokrýt jak funkční tak nefunkční požadavky. * **Akceptační testy** * Hlavní částí testování z pohledu dodávky aplikace zákazníkovi. **Další testy:** * **Funkční testy** * slouží k nalezení rozdílů mezi aktuální aplikací proti funkční specifikaci (funkční požadavky) * **Nefunkční testy** * Zahrnují testování výkonu, zátěžové testování, stres testování, testování použitelnosti, testování udržovatelnosti, testování spolehlivosti a testování přenositelnosti. * Je testováním toho, “jak“ systém pracuje (jako celek). * **Statické testy** * Provádí manuální prozkoumání (revidování) a automatizovanou analýzu (statickou analýzu) kódu nebo jiné projektové dokumentace (uživ.příručky, apod.) * **Dynamické testy** * Znamenají provádění testování na již běžící systému, aplikaci * **Regresní testy** * Testy na ověření stávající funkcionality (provádí se po opravení chyb či novem release) * **Progresní testy** * Testy na ověření nové funkcionality * **Smoke test** * Je krátký test, který slouží jako ověření, že vyvíjená aplikace je "způsobilá" pro další fázi testování. * **Assembly testy** * Mají za úkol ověřit, že jednotlivé části kódu, testované v rámci unit testů, spolu fungují. ====== Softwarové metriky ====== Údaj (měření, atribut softwaru), který lze nakonec převést na číselné hodnocení. * **kvantitativní** (číselně vyjádřená) míra, tj. ukazatel do jaké míry se nějaký atribut vyskytuje v systému, komponentě nebo procesu * **kvalitativní** charakter, tj. nečíselné vyjádření Dělíme na: * **Produktové** * zdrojový kód, dokumentace, cyklomatická složitost (počet cest programem), počty funkčních bodů * **Procesní** * činnosti spojené s vývojem, doba strávená na jednotlivých úlohách, původní odhad a skutečná reálná doba * **Metriky zdrojů** * HW, lidé, čas, nemocnost, výkonnost * **Implicitní (in proces)** * zjistitelné pouze během vývoje * **Explicitní (after proces)** * zjistí se kdykoliv i po skončení vývoje (z artefaktů produktů systému) * Lines Of Code (LOC), 1000 Lines Of Code (KLOC) * počet chyb/KLOC * počet defektů/KLOC * cena/LOC * velikost dokumentace/KLOC * počet uživatelských vstupů * počet už. výstupů * počet dotazů * počet souborů * počet spojení s jinými systémy ===== Metriky složitosti ===== Program je věta, která vznikla na určité slovní zásobě. Na základě poměru délky věty (programu) a velikosti slovní zásoby (počet operátorů a operandů) získáme složitost. Vnímá program jako graf. Dochází k výpočtu **cyklomatické složitosti**: * Kolik je možných průchodů grafem nebo kolik je tam nezávislých větví. Funguje také jako indikátor spolehlivosti. * Pokud V(G) je větší než 10 má velký chybový potenciál a zle se testuje. * V(G) je v podstatě počet uzavřených oblastí v rovinném grafu. Také založen na cyklomatické složitosti. Odvozeno od počtu větvení (C) a počtu řídících proměnných (V), především zohledňuje složitost podmínek tj. samotných uzlů! \\ * C + V ====== Odhadování nákladů a času vývoje SW ====== Při odhadování se reflektuje: * Minulý podobný projekt (velmi dobrý výchozí bod) * Použití dekompoziční techniky * Použití empirických modelů * Odhad se zpožděním (nutný určitý buffer, pokud by se něco pokazilo) Metrika, říkající kolik toho funkční jednotka umí. Měří aplikační oblast, nezkoumá technickou oblast. T - usílí (člověkodny) D - doba řešení c - hodnota podle předchozích projektů N - Délka programu N = c * T^{1/3} * D*^{4/3} * Odhadování pracnosti shora-dolů. * Vychází z Putnama a odhadu délky programů KSLOC. * Zdroj empirických dat je větší počet předchozích projektů a pozorování. * **Model** (přesnost výpočtu) * základní (hrubý odhad) * střední * pokročilý (bere v potaz etapu vývoje) * **Mód** (jak je projekt obtížný) * organický (jednodušší, dobře řešitelné projekty menšího rozsahu) * bezprostřední (středně obtížné projekty) * vázaný (rozsáhlé projekty s vysokými nároky na řízení) E = a * F * (KLOC)^b\\ T = c* E^d\\ * a,b,c,d - parametry volené podle úrovně modelu a módu * T - doba řešení * E = úsilí * F = korekční faktor, ekvivalence s „c“ v Putnamovi tedy produktivita Nemá smysl dělat přesné výpočty na začátku projektu -> korekční faktor vždy 1 a základní model. Důvod změny: * nové SW procesy * nové jevy měření * nové možnosti jako znovupoužití SW 3 různé modely: * **ACM (Aplication Composition Model)** * pro projekty s použitím moderních nástrojů a GUI * **EDM (Early Design Model)** * pro hrubé odhady v úvodních etapách, kdy se architektura vyvíjí * **PAM (Post Architecture Model)** * pro odhady poté, co byla specifikována architektura ====== Kvalita softwaru ====== * Kvalitativní atributy souvisí převážně s non-funkčními požadavky. * Performance (výkon) * Reliability (spolehlivost) * Security (bezpečnost) * Scalability (škálovatelnost) * Maintainability (udržovatelnost) * Techniky hodnocení kvality * monitoring a testování * verifikace kvality existujícího systému * predikce na základě modelu * odhad kvality systému ve vývoji * formální verifikace * verifikace formulovaných tvrzení o systému **Obecný model kvality (Quality model)** * **Operation:** * Dělá to, to co má? Týká se splnění specifikace, standardů a uživatelského očekávání. * pohled uživatele * **Revision:** * Je dobře navržený? (dobře testovatelný, rozšiřitelný apod.) * Týká se vývoje. * Pohled vývojářů * **Transition:** * Je dobře nasaditelný? (přenositelnost, nezávislost na HW, pohodlná instalace) * Celkový pohled obou stran Stupeň, do jaké míry systém, komponenta nebo proces splňuje specifikované požadavky. (spíše u SW na zakázku) Stupeň, do jaké míry systém, komponenta nebo proces splňuje zákazníkovy nebo uživatelovy potřeby nebo jeho očekávání. (spíše u krabicového SW) ===== Techniky zajištění kvality software ===== * Obecně lze mluvit o testování, validaci a verifikaci produktu. * Validací se rozumí otázka, zda jsme vytvořili správný produkt tj. jestli produkt odpovídá potřebám uživatele. * Verifikací se rozumí, zda jsme produkt vytvořili správně tj. zda produkt odpovídá specifikaci. * Testováním se pak pokoušíme zmíněné předchozí dokázat pro omezenou sadu příkladů. * Inspekce, recenze * Testování * Měření * Standardy a procedury ====== Údržba a znovupoužitelnost + Refaktoring ====== Velmi nákladná v čase, finance odpovídají tomu jak dlouho ho chceme udržet. Náklady jsou 2x -100x větší než na vývoj. Na údržbu se mělo myslet již při vývoji. * Oprava softwarových chyb * Adaptace softwaru na jiné operační prostředí * Přidat nebo měnit systémovou funkcionalitu -> každá implementace degraduje kvalitu systému ===== Systémový re-engineering ===== Znovu napsání celé části systému bez účelu změnit její funkcionalitu, když subsystémy vyššího systému vyžadují častou údržbu. Cílem je vytvoření nového systému, který by se lépe udržoval (i snížení ceny za údržbu). ===== Refactoring ===== Refactoring je kontinuální proces vylepšení skrze vývojový a evoluční proces. Jeho záměrem je vyhnout se degradaci struktury a kódu, která zvyšuje cenu za údržbu. **„Code smells“**\\ * Duplikovaný kód - kód se opakuje na různých místech programu * Dlouhé metody * Long Parameter List - dlouhý seznam parametrů * Shotgun Surgery - abychom udělali jednoduchou změnu v kódu, je nutné sahat na mnoho míst, indikátor toho, že máme špatný model, že třídy mají špatnou zodpovědnost * Middle Man - zprostředkované volání objektu zbytečně přes prostředníka * Lazy Class - prázdná skořápka, třída, která nic nedělá * Spekulativní obecnost - kód, který je v programu obsažen, aby sloužil někdy do budoucna ===== Znovupoužitelnost ===== Hlavní výhodou je několikanásobné finanční ohodnocení jednou vyvinuté komponenty. **Úrovně znovupoužitelnosti (reuse levels)**\\ * Abstrakce (The abstraction level): analytické prvky * Objekty (The object level): třídy * Komponenty (The component level): kolekce tříd * Systém (The system level): celý systém a různé platformy Model vývoje SW, založen na systematickém znovuužití, kde jsou systémy integrovány z existujících komponent (commercial-off-the-shelf = COTS) * Zbylou funkcionalitu (kterou ještě nemáme) doprogramujme, především proxy, adaptéry a GUI. * Jedná se o standardní budování business systémů. Zákony se zabývají fází evoluce, popisují rovnováhu mezi novými požadavky a údržbou na straně jedné a zvyšující se složitostí, snižující se “business value” na straně druhé. * **Zákon trvalé proměny** * Systém používaný v reálném prostředí se neustále mění, dokud není levnější systém restrukturalizovat nebo nahradit zcela novou verzí. * **Zákon rostoucí složitosti** * Při evolučních změnách je program stále méně strukturovaný a vzrůstá jeho vnitřní složitost. * Odstranění složitosti vyžaduje dodatečné úsilí. * **Zákon vývoje programu** * Rychlost globálních změn atributů systému se může jevit v omezeném časovém intervalu jako náhodná. * V dlouhodobém pohledu se však jedná o seberegulující proces, který lze statisticky sledovat a předvídat. * **Zákon invariantní spotřeby práce** * Celkový pokrok při vývoji projektů je statisticky invariantní. * Jinak řečeno, rychlost vývoje programu je přibližně konstantní a nekoreluje s vynaloženými prostředky * **Zákon omezené velikosti přírůstku** * Systém určuje přípustnou velikost přírůstku v nových verzích. * Pokud je limita překročena, objeví se závažné problémy týkající se kvality a použitelnosti systému. Týká se začlenění nového člena týmu do zpožděného projektu (ten, který s ním neměl zatím žádný styk :D). Zákon říká, že “Přidání řešitelské kapacity u opožděného projektu může zvětšit jeho zpoždění (náklady na začlenění nového pracovníka do týmu jsou zpravidla větší, než jeho přínos)”. ====== Zdroje ====== * slidy pa103 * slidy pa017 * https://docs.google.com/document/d/1JVC34-jBqK-hnyxty9YNelID_LChUsvREdgS9NaEjvI