Porownanie i analizaXPinne, Zarządzanie Projektami Informatycznymi


Wyższa Szkoła

Zarządzania i Bankowości

W Krakowie

Studia Inżynierskie

Wydział Informatyka

Tomasz Guzik

Analiza i porównanie trzech podejść produkcji i tworzenia oprogramowania: Podejście Kaskadowe, Podejście Extreme Programming, oraz Rational Unified Process.

Praca Inżynierska

napisana pod kierunkiem

dr inż. Wiesław Byrski

Kraków 2007

Spis treści:

Czym jest metodyka i po co się ją stosuje?

Wstęp.

Rozdział I - Metodologia Extreme Programming

1.1. Historia Extreme Programming - wprowadzenie . . . . . . . . . . . . . . . . . . . . 5

1.2. Opis metodyki - czym jest XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3. Podstawowe cechy Extreme Programming . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.3.1. Planowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.3.2. Projekt i iteracja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.3.3. XP - wspólnota kodu i programowanie parami . . . . . . . . . . . . . . . . 10

1.4. Cechy charakterystyczne Extreme Programming . . . . . . . . . . . . . . . . . . . 12

1.4.1. Planowanie - wskazówki i szczegóły . . . . . . . . . . . . . . . . . . . . . . . . 13

1.4.2. Projektowanie - wskazówki i szczegóły . . . . . . . . . . . . . . . . . . . . . 20

1.4.3. Implementacja - wskazówki i szczegóły . . . . . . . . . . . . . . . . . . . . . 22

1.4.4. Testowanie - wskazówki i szczegóły . . . . . . . . . . . . . . . . . . . . . . . 26

1.5. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Rozdział II - Metodologia Rational Unified Process

2.1. Wprowadzenie do Rational Unified Process - krótka historia . . . . . . . . . 30

2.2. Opis metodyki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.3. Cechy charakterystyczne, architektura i zasada działania RUP-a . . . . . . . 32

2.3.1. Iteracyjność . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

2.3.2. Zarządzanie wymaganiami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

2.3.3. Architektura bazująca na komponentach . . . . . . . . . . . . . . . . . . . . 35

2.3.4. Wizualizacja modelowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.3.5. Bieżąca kontrola jakości . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.3.6. Zmiany kontrolne w oprogramowaniu . . . . . . . . . . . . . . . . . . . . . . 37

2.4. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Rozdział III - Kaskadowe metody w tworzeniu oprogramowania

3.1. Co to kryje się pod pojęciem „model kaskadowy” . . . . . . . . . . . . . . . . . . 38

3.2. Ogólny opis cech podejścia kaskadowego . . . . . . . . . . . . . . . . . . . . . . . . . 38

3.3. Model kaskadowy - rodzaje i zastosowanie . . . . . . . . . . . . . . . . . . . . . . . 39

3.3.1. Kaskadowy model bez iteracji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

3.3.2. Kaskadowy model z iteracjami . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

3.4. Porównania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

Rozdział IV - Porównanie trzech podejść produkcji i tworzenia oprogramowania

4.1. Porównanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

4.1.1. Szkielet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

4.1.2. Analiza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4.2. Wnioski i zakończenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Czym jest metodyka i po co się ją stosuje?

Metodyka

[z gr. Metodol]

(w literaturze angielskojęzycznej określana jest mianem procesu)

„Jest to zbiór ustandaryzowanych, uporządkowanych i sprawdzonych zasad, odnoszących się do sposobów rozwiązania konkretnego zadania. Metodyka opisuje „metody” postępowania przy realizacji i dojściu do wyznaczonego celu”.

Właściwie metodyka stanowi niejako „zbiór narzędzi i rozwiązań” potrzebnych do realizacji konkretnego celu, stara się udzielić odpowiedź na pytanie „Jak należy rozwiązać konkretne zagadnienie?”, jest ona próbą wcielenia w życie pewnych sprawdzonych praktyk.

Metodyki stosowane są w celu zwiększenia efektywności przy realizacji postawionych zadań, umożliwiają obliczenie postępu dokonanego w trakcie prowadzonych prac i co najważniejsze wprowadzają schemat postępowania przy wykonywaniu owych prac!

Wstęp

Na przełomie dwudziestego i dwudziestego pierwszego wieku nastąpił gwałtowny rozwój informatyki. Początkowo z braku odpowiednich możliwości technologicznych, komputery potrafiły wykonywać tylko proste zadnia matematyczne. Dopiero z czasem, gdy moce obliczeniowe komputerów zaczęły radykalnie wzrastać zaczęły również powstawać coraz to nowsze i coraz bardziej wyrafinowane programy, które służyły już nie tylko nauce. W wyniku tak szybkiego rozwoju informatyki oraz wynikających z tego nowych potrzeb, zaczęły powstawać coraz to bardziej rozbudowane programy oraz systemy informatyczne. Dziedzina informatyki, która zajmowała się tworzeniem tego typu narzędzi została nazwana inżynierią oprogramowania. Od chwili jej powstania aż po dziś dzień inżynieria podąża krok w krok za rozwojem samej informatyki, często nawet wyprzedza ją, badając nowe możliwości i rozwiązania, które w przyszłości mogą znacznie uprościć nam codzienne życie.

Inżynieria zajmuje się wszystkimi aspektami produkcji oprogramowania od początkowych analiz aż do produktu końcowego, czyli ewolucji gotowego programu. Wraz z postępem i rozwojem nowych technologii oraz Internetu inżynierowie już na poziomie projektów zaczęli napotykać na swojej drodze na coraz to nowsze i coraz bardziej skomplikowane problemy, które musieli w jakiś sposób rozwiązać. W wyniku tychże piętrzących się problemów oraz chęci tworzenia coraz bardziej doskonalszych programów stworzono wiele ciekawych, przydatnych i rozbudowanych metodyk ułatwiających tworzenie różnego rodzaju oprogramowania.

W wyniku wprowadzenia nowego terminu a co za tym idzie i samych metodyk, tworzenie oprogramowania stało się bardziej uproszczone oraz zhierarchizowane i usystematyzowane. Można, zatem pokusić się o stwierdzenie, że w wyniku wprowadzenia w życie pierwszych metodyk, zaczęto wprowadzać pewne standardy do firm, które zajmowały się tworzeniem oprogramowania. Do takich często stosowanych metodyk tworzenia oprogramowania zaliczyć można np. podejście Kaskadowe, Extreme Programming, Rational Unifed Process, PRINCE2, XPrince czy TenStep.

Na poziomie tego dokumentu skupię się na analizie trzech głównych metodyk -XP, RUP oraz podejścia Kaskadowego. Dokonując tychże analiz podobieństw i różnic w/w metodyk spróbuję odpowiedzieć na pytanie, która z nich i w jakich warunkach są lepsze do zastosowanie przy produkcji oprogramowania.

I Rozdział - Metodologia Extreme Programming.

1.1 Historia Extreme Programming - wprowadzenie.

We wczesnych latach 90'tych Kent Back pracując przy tworzeniu oprogramowania zastanawiał się nad stworzeniem nowej, lepszej metody przy projektowaniu i produkcji systemu. Kent i jego zespół wiedzieli o niedoskonałościach metody kaskadowej, która była powszechnie stosowana w tamtych czasach. Chcieli oni stworzyć coś bardziej niezawodnego niż stosowana metodyka. Spędzili oni wiele czasu nad rozwiązaniem tego problemu. Razem próbowali stworzyć taką metodę, która uprościłaby, a co za tym idzie i usprawniła pewne kroki przy tworzeniu oprogramowania. Kent przy pracach skupił swoją uwagę na czynnikach, które usprawniają oraz utrudniają tworzenia oprogramowania. W marcu 1996 roku Kent Back podjął pracę projektowe w firmie samochodowej DaimlerChrysler, wykorzystując tam już nowo nabytą wiedzę oraz technikę przy tworzeniu oprogramowania. W rezultacie późniejszych prac powstała metodologia znana dziś pod pełną nazwą jako Extreme Programming (- w skrócie XP). W metodologii tej twórcy zaproponowali całkowicie nowe podejście do tworzenia oprogramowania akceptując prawo klienta do zmiany wymagań. Założenia leżące u podstaw tej metodyki okazały się w praktyce bardzo skuteczne, co potwierdziły prace wdrożeniowe w takich przedsiębiorstwach jak Bayerische Landesbank, Credit Swiss Life, DaimlerChrysler, First Union National Bank, Ford Motor Company czy UBS.

Kent i jego zespół uświadomili sobie w czasie prac, iż występują 4 czynniki (- zmienne), które w mniej lub bardziej bezpośredni sposób przyczyniają się do płynnej pracy przy tworzeniu oprogramowania. Zmiana lub poprawa jednej z nich potrafi usprawnić lub utrudnić pracę nad całym projektem np. - potrzebujemy usprawnić komunikację, szukamy najlepszej drogi do uproszczenia lub ulepszenia projektu, potrzebujemy dokonać sprzężenia, - na jakim etapie rozwoju znajduje się projekt i chcemy przy tym postępować odważnie bez przeszkód -w tym właśnie ma pomóc metodologia XP.

1.2 Opis metodyki - czym jest XP?

0x01 graphic

Metodykę tę stworzono, aby efektywniej zarządzać przedsięwzięciami realizowanymi w "produkcyjnych" i trudnych warunkach biznesowych, w których wymagania i potrzeby ciągle ulegają zmianom.

Jeżeli dany system informatyczny ma poprawnie realizować założone funkcje, wówczas kluczem do jego sukcesu jest wystarczająco wczesne aktywne zaangażowanie użytkowników w przedsięwzięcie, zwłaszcza w zakresie testowania systemu i dostarczenia odpowiedniego sprzężenia zwrotnego dla jego twórców. W momencie, gdy programista staje w obliczu zdefiniowanych procesów i ich ograniczeń, niezbędna okazuje się indywidualna kreatywność oraz grupowa "burze mózgów". Rozwiązania takie przynoszą różnego rodzaju zwinne metodyki, które koncentrują się głównie na członkach zespołu i tworzeniu prostych, a także użytecznych rozwiązań. Taką właśnie drogę w prowadzeniu projektu umożliwia również lekka metodyka Extreme Programming.

XP to zbiór prostych reguł oraz praktycznych uwag, trudnych do przyjęcia w codziennej praktyce bez wewnętrznej grupowej zgody. Metodologię tę wykorzystuje się w projektowaniu aplikacji bazodanowych ( -internetowych) oraz w projektowaniu oprogramowań informatycznych. XP jak już wcześniej wspomniałem powstała na drodze obserwacji i zbierania tych praktyk, które sprzyjały powstawaniu oprogramowania w sposób prosty, a zarazem i efektywny - przyjmując perspektywę programisty. Praca według tejże metodologii pozwala programistom na dużą swobodę, która zorientowana jest na szybkie dostarczanie korzyści dla klienta (użytkownika) -czyli po prostu szybkie dostarczenie gotowego produktu.

Programowanie ekstremalne to wytyczne i metody programowania mające na celu wydajne tworzenie małych i średnich "projektów wysokiego ryzyka", czyli takich, w których nie wiadomo do końca, co się tak naprawdę robi i jak to prawidłowo zrobić. Przyświeca temu koncepcja prowadzenia projektu informatycznego, wywodząca się z obserwacji innych projektów, które odniosły sukces.

"XP is a lightweight methodology for small to medium sized teams developing software in the face of vague or rapidly changing requiremente" - Kent Back

1.3 Podstawowe cechy Extreme Programming.

§1. Metodyka XP oparta jest na kilku prostych regułach rządzących czterema głównymi praktykami procesu produkcyjnego: planowanie, projektowanie, kodowanie, testowanie.

§2. Ważne jest, aby funkcjonalności dostarczane były w krótkich ( -maksymalnie do trzech tygodni) okresach projektowych ( -inkrementach), sterowanych częściowymi wymaganiami ( - tzw. opowieściami użytkowników).

§3. Wszystkie sprawy formalne ( -organizacyjne) załatwiane są w krótkich codziennych spotkaniach "na stojąco" trwających góra od 15 do 20 minut i na których omawia się bieżący plan zajęć oraz problemy, jakie dotychczas wynikły w projekcie!

§4. Bardzo istotną cechą jest "Refaktoryzacja", czyli tzw. upraszczanie kodu.

0x01 graphic

(* Opracowanie własne)

§5. Użytkownicy w XP są aktywnymi członkami zespołu projektowego, pomagając przy tym twórcom produktu, który aktualnie jest dla nich wytwarzany.

1.3.1 Planowanie

Planowanie jest jednym z podstawowych czynności w Extreme Programming. Dzięki niemu można łatwo i szybko zbudować harmonogram projektu w oparciu o opowiadania użytkowników. Poniższy rysunek przedstawia pętle procesu planowania (Rysunek I.).

0x01 graphic

Rys. 1 - Kolejne stopnie procesu planowania w XP.

Struktura:

Stworzenie planu -okres miesięcy,

Plan iteracyjny - okres tygodni,

Testy akceptacyjne - okres dni,

Spotkanie „na stojąco” - okres dnia

Negocjacje parami - okres godzin

Pojedyncze testy - okres minut

Programowanie parami - okres sekund

KOD

(* Opracowanie własne)

Z kodu można z powrotem powrócić do konkretnego, wcześniejszego podpunktu i rozpocząć proces powtórnie -podobnie jak to ma miejsce w modelu kaskadowym z iteracjami, tyle, że tam jest możliwość powrotu z każdego podpunktu do poprzedniego, a nie dopiero z fazy końcowej projektu.

1.3.2 Projekt i iteracja

Dzięki odpowiedniemu planowaniu i iteracji można w szybki sposób dostarczać kolejne „kawałki” programu. W wyniku takich krótkich i przyrostowych kroków oraz planowaniu tylko następnych iteracji, niweluje się możliwość powstania wersji programu, która nie współgrałaby z odpowiadającą jej iteracjom, a co za tym idzie koszty błędów są radykalnie mniejsze niż w przypadku podejść kaskadowych.

0x01 graphic

Rys. 2 - Planowanie projektu w XP.

Główny cel wytwórczy:

0x01 graphic

Rys. 3 - Planowanie i iteracyjne podejście w XP.

Pojedyncza iteracja:

1.3.3 XP - wspólnota kodu i programowanie parami

Dzięki takiej technice podejścia do tworzenia oprogramowania, można zaprzęgnąć do pracy cały zespół, dodatkowo przy tym eliminując tzw. wąskie gardło kodowanie, gdzie tylko dana osoba pracująca nad daną częścią kodu wie, co ona robi. Ponadto dzięki spotkaniom na stojąco można w szybki i prosty sposób omówić najważniejsze problemy, z którymi w określonym momencie borykają się pracownicy.

0x01 graphic

Rys. 4 - Rozwój projektu według XP.

Proces wytwarzania to:

0x01 graphic

Rys. 5 - Zastosowanie polityki wspólnego kodu w XP.

Wspólna własność kodu powstaje:

1.4 Cechy charakterystyczne Extreme Programming.

Jak już wcześniej wspomniałem metodyka Extreme Programming opiera się na następujących wartościach, leżących u podstaw wszystkich wykonywanych czynności: komunikacja, prostota, sprzężenie zwrotne i odwaga. Wartości te łączy ze sobą efekt synergii, u podstaw, którego leży dążenie do szybkiego dostarczenia dobrej jakości oprogramowania zgodnego z oczekiwaniami klienta. Prosty produkt umożliwia łatwą komunikację, gdyż programiści nie mają problemu z rozszyfrowaniem sposobu jego działania, problem zaczyna się w bardziej skomplikowanych systemach. Wszechogarniająca komunikacja umożliwia natychmiastowe sprzężenie typu: oczekiwania klienta → system informatyczny → świat rzeczywisty. Odwaga natomiast sprawia, że praca posuwa się szybko, a nowe problemy i zmieniające się wymagania nie spowalniają pracy zespołu.

Planowanie

  • Opowieści użytkowników są spisywane,

  • Planowanie wydajnie buduje harmonogram,

  • Tempo projektu jest mierzalne,

  • Projekt składa się z iteracji,

  • Planowanie iteracji jest początkiem iteracji,

  • Występowanie ruchów w zespole (przegrupowania),

  • Spotkania na stojąco,

  • Przywróć XP, jeśli się załamuje.

Kodowanie (implementacja)

  • Użytkownik jest zawsze dostępny,

  • Kod spełnia uzgodnione reguły formalne,

  • Napisz najpierw test, potem kod programu,

  • Programowanie parami,

  • Integruj często,

  • Kolektywna własność kodu,

  • Nie optymalizuj do ostatniej chwili,

  • Nie ma nadgodzin.

Projektowanie

  • Prostota,

  • Wymyśl metaforę systemu,

  • Twórz rozwiązania dla redukcji ryzyka,

  • Nie twórz funkcjonalności przedwcześnie,

  • Dokonuj refaktoryzacji zawsze i wszędzie.

Testowanie

  • Każdy kawałek programu musi mieć test,

  • Cały kod przechodzi wszystkie testy jednocześnie,

  • Testy akceptacyjne są wykonywane często.

Tab. 1 - Podstawowe wartości XP i ich cechy charakterystyczne.

1.4.1 Planowanie - odpowiednie praktyki, wskazówki i szczegóły.

Opowiadania te mają podobne ( -pomocnicze) zastosowanie, jak schematy tzw. przypadków użycia. Są używane m.in. po to, aby określić szacunkowy czas, jaki będziemy potrzebowali na spotkanie, które będą miały na celu opracowania planu nowej wersji systemu. Są one również używane zamiast obszernego dokumentu zawierającego wszystkie spisane wymagania.

Opowiadania użytkowników to nic innego jak notatki spisywane przez klientów po to, aby było wiadome, co dany system powinien robić dla nich. Notatki te są również podobne do scenariuszy przypadków użycia, lecz nie ograniczają się do opisywania samego interfejsu użytkownika, tylko przede wszystkim do funkcji, jakie dany system ma posiadać i co powinien robić.

Opowiadania użytkownika są przeważnie w formacie trój zdaniowych akapitów tekstu napisanych przez klienta, używając jego słownictwa, bez technicznej terminologii. Oprócz formy informacyjnej opowiadania pełnią również rolę do sterowania tworzeniem testów akceptacyjnych. Testy te mają za zadanie stwierdzić, czy oczekiwania użytkowników zostały poprawnie zrozumiane, a co za tym idzie i zaimplementowane.

Jednym z największych powodów nieporozumień podczas produkcji oprogramowania są różnice pomiędzy opowiadaniami, a specyfikacjami wymagań. Główną cechą odróżniającą te dwa wymienione podejścia jest poziom szczegółowości opisu. Opowiadania użytkowników powinny zapewniać tylko taką ilość szczegółów i informacji, jaka jest wystarczająca do rozsądnego oszacowania czasu potrzebnego na ich przetworzenie i implementację. Gdy nadejdzie czas implementacji danego opowiadania wykonawcy kontaktują się z klientem, aby następnie otrzymać dokładniejszy opis wymagań. W wyniku otrzymania dalszych informacji projektanci mogą ocenić jak długo będzie trwała implementacja oczekiwań. Każde opowiadanie zabiera od jednego do nawet trzech tygodni pracy (-oczywiście, jeśli wszystko pójdzie „idealnie”, tzn. z niewielką ilością przerw przy krótkim opowiadaniu i opisie klienta). Faktycznie plan ten ulega często zmianie ze względu na możliwość dłuższych przerw lub w przypadku, gdy opowiadanie klienta odnośnie danego systemu będą dłuższe, a co za tym idzie i cały system będzie bardziej drobiazgowy i dokładny. Inną cechą różniącą opowiadania i specyfikację wymagań jest akcent na potrzeby użytkownika. Powinno się unikać szczegółów, specyficznych technologii, struktury bazy danych i algorytmów. Powinno się próbować utrzymać historie skoncentrowane wokół potrzeb i korzyści klienta, nie wdając się na tym etapie w szczegóły samego interfejsu aplikacji.

Zwołuje się okresowo spotkania w celu opracowania planu publikacji. Planowanie to służy do ustalenia kierunku rozwoju projektu oraz do określania kolejnych iteracji. Spotkaniem kieruje zbiór odpowiednich reguł, które zezwalają wszystkim ludziom zaangażowanym w tworzenie projektu, na podejmowanie decyzji w zależności od ich kompetencji. Zasady, które obowiązują podczas spotkania tworzą metody negocjacji planu projektu oraz jego zatwierdzenia. Zasadniczym punktem spotkania jest ocena każdego z opowiadań i przypisanie mu odpowiedniej liczby, określającej szacunkową ilość tygodni, jaka jest potrzebna do realizacji danego zadania. Liczba ta nie uwzględnia żadnych innych obowiązków i wynikłych z nich opóźnień, zakłada ona po prostu idealną sytuację, gdy możemy poświęcić cały dostępny czas na realizację danego przedsięwzięcia. Nie bierzemy tu pod uwagę żadnej dodatkowej pracy, jednakże dodatkowo wliczamy testowania.

Jak już wcześniej wspomniałem klient jest członkiem grupy projektowej dlatego też to on decyduje, które opowiadania są ważniejsze lub mają większy priorytet na wykonanie, a które mniejszy. Można planować określając czas lub zakres realizacji. Za pomocą wcześniej już wyliczonej szybkości projektowania można wyznaczyć ile opowiadań lub historii może powstać w ciągu zadanego czasu lub jak długo zajmie ukończenie prac nad danym zbiorem ( -zakresem) opowiadań. Jeśli planujemy określając przy tym czas, robimy to w ten sposób, iż mnożymy liczbę dostępnych iteracji przez prędkość projektowania obliczając w ten sposób ilość opowiadań zdolnych do realizacji w danej jednostce czasu. Jeśli z kolei planujemy określać zakres opowiadań, wtedy dzielimy sumę tygodni oszacowaną na ich podstawie przez prędkość projektowania. Uzyskujemy w ten sposób liczbę iteracji potrzebnych do ukończenia wersji. Poszczególne iteracje są planowane dokładnie tuż przed ich rozpoczęciem i nigdy nie ustala się z góry ich przebiegu.

Spotkania, które są przeprowadzane w celu opracowania odpowiedniego planu wersji, zwane także z angielskiego „grą planistyczną” mają swoje reguły, których opis można znaleźć w tzw. „repozytorium wzorców Portland”. Jeśli dany plan, został źle przyjęty przez kierownictwo wtedy opracowuje się nowy plan publikacji, akceptowalny przez wszystkie strony. Dany plan publikacji negocjuje się zarówno z developerami, klientem jak i kierownictwem, do czasu, aż wszyscy zgodzą się na jego przebieg.

0x01 graphic

Rys. 6 - Gra planistyczna.

Głównymi założeniami planowania publikacji jest opisywanie projektu czterema wielkościami:

1)zakresem - opisującym jak dużo jest do zrobienia.

2)zasobami - określa ile mamy do dyspozycji osób.

3)czasem - ukazuje nam, kiedy dany projekt, albo wersja będzie ukończona.

4)jakością - charakteryzuje jak dobre będzie oprogramowanie, nad, którym pracujemy, i jak dokładnie zostanie ono przetestowane.

Kierownictwo może określić tylko trzy z nich, nie koniecznie jednak wybiera wszystkie. Co do czwartej to dostajemy ją już zawsze podczas samej realizacji planu publikacji. Należy tu zauważyć, iż obniżenie jakości poniżej doskonałości ma nieprzewidywalny wpływ na trzy pozostałe cechy. W istocie mamy, więc do dyspozycji tylko 3 parametry, które aktualnie możemy chcieć zmienić.

Oprócz samego negocjowania i prac w projekcie developerzy powinni zapanować także nad klientami, którzy chcą, aby właśnie ich projekt został natychmiast ukończony poprzez zaangażowanie do pracy jak największej liczby ludzi.

Plan ten określa, które opowiadania mają zostać zaimplementowane w danej wydaniu systemu oraz w jakim terminie należy się spodziewać tego systemu. Dzięki takiemu podejściu daje się użytkownikom możliwość wyboru, który zestaw opowiadań zostanie zaimplementowany podczas najbliższego planowania iteracji. Wybrane przez klienta opowiadania są przekładane na odrębne ćwiczenia programistyczne do zaimplementowania w czasie odpowiedniej iteracji. Opowiadania takie oprócz samego przekładania na kod są również zamieniane na testy akceptacyjne, które tworzy się podczas iteracji. Testy te uruchamia się w czasie bieżącej, a także w późniejszych iteracjach w celu weryfikacji, które historie zostały ukończone prawidłowo. Dzięki temu można w szybki sposób stwierdzić, iż ukończyło się dany rozdział, a co za tym idzie można kontynuować dalszą pracę. Gdy tempo projektowania w sposób drastyczny ulegnie zmianie na gorsze, wyznacza się spotkania z klientem w celu ustalenia nowego planu wersji.

Producenci, czyli inaczej mówiąc twórcy projektu muszą uświadomić sobie, aby regularnie wypuszczać nowe wersje swojego systemu, nad którym pracują lub pracowali. Wynika to z faktu, iż dany producent stosuje iteracyjne podejścia do tworzenia oprogramowania.

Częste spotkania, które poświęca się planowaniu nowych ulepszonych lub poprawionych wersji służą do ujawnieniu drobnych elementów funkcjonalności, które mogą być w niedługim czasie zaimplementowane. Należy tu zaznaczyć, że klient posiada na bieżąco dostęp do aktualnej wersji środowiska, dzięki czemu może dzielić się spostrzeżeniami z wykonawcami projektu.

Jest miarą określającą jak szybko może zostać ukończy dany projekt. Często zamiennie używa się również współczynnika obciążenia, jednakże prędkość projektowania wydaje się być znacznie użyteczniejsza. Jeśli ma być to pomocne, to można również używać współczynnika obciążenia, i na jego podstawie określać szacunkową prędkość projektowania, którą można wykorzystać. Aby określić tempo projektowania należy po prostu zliczać ile opowiadań użytkowników lub ile zadań do zaimplementowania zebraliśmy podczas aktualnej iteracji.

Podczas danego spotkania planującego wersję można zweryfikować ile pozostałych oraz nowych historii w najbliższym czasie zostanie zaimplementowanych, obliczając to na zasadzie ilości już zrobionych opowiadań, które wdrożono w życie. Ponadto w czasie takiego spotkania twórcy mogą przypisać odpowiednią liczbę dni do prac nad odpowiednim zadaniem, która to wartość równa jest prędkości projektowania zmierzonej podczas poprzednich iteracji. Ten zmyślny, a zarazem i prosty mechanizm pozwala producentowi odnaleźć się po trudnej iteracji. Podczas projektowania możliwa jest również kilkukrotna zmiana prędkości, zarówno w górę jak i w dół. Wynika to głównie z faktu czy developerzy mają obszerniejsze i bardziej skomplikowane historie do zaimplementowania czy nie. Kiedy szybkość rośnie, developerzy szybciej realizują zadane historie, a co za tym idzie mogą wcześnie dopytywać się klientów o dalsze opowiadania, które muszą wykonać. Natomiast, kiedy szybkość maleje znaczy to, że na dane zadania została przewidziana zbyt mała liczba jednostek czasu, przez co należy dokonać pewnych korekt w dalszym planowaniu

Współczynnik ten jest równy rzeczywistym, kalendarzowym dniom, które są niezbędne do zrealizowania danego zadania, podzielone przez liczbę dni tzw. "idealnych".

Pod terminem „dni idealnych” rozumiemy dni, w które moglibyśmy się całkowicie poświęcić na zadany projekt (-bez przerwy), jednakże w rzeczywistych realiach nie jesteśmy w stanie tego zrobić. Współczynnik obciążeniowy opisuje liczbę dni, jaką będziemy musieli poświęcić na zrealizowanie danego zadania. Współczynniki od 2 do 5 oznacza normę. Współczynnik o numerze 2 przedstawia optymistyczną wizję projektu, z kolei 3 to technologia typowa. Czwórka i piątka natomiast stosowane są w projektach, które wymagają użycia technologii nietypowych. „Ron Jeffries radzi używania trójki w początkowej fazie nowego projektu.” Po wybraniu już odpowiedniego współczynnika należy mierzyć i śledzić go, dodatkowo przy tym zwracając uwagę na tempo programowania w trakcie całego projektu. Współczynnik obciążenia nie może stać się wyznacznikiem do porównywania dwóch projektów! Każdy z projektów, jak również zespołów, który nad nim pracował jest oryginalny i niepowtarzalny, dlatego też każdy projekt będzie miał inny współczynniki obciążenia! „Jeśli współczynnik zmieni się w sposób dramatyczny, należy zwołać spotkanie, aby ponownie ocenić i przenegocjować plan publikacji. Należy się spodziewać, że kiedy system ruszy, współczynnik ponownie ulegnie zmianie z powodu zdań podtrzymujących.”

Spotkania poświęcone planowaniu są zwoływane na początku każdej z iteracji w celu opracowania jej jak najlepszego planu, który uwzględniłby zadania dla programistów. Każda iteracja może trwać od 1 do nawet 3 tygodni. Jak już wcześniej wspomniałem klient wybiera odpowiednie opowiadania z planu wersji, które mają być zaimplementowane jako pierwsze podczas bieżącej iteracji. Oprócz tego dodatkowo są wybierane do przerobienia testy akceptacyjne, które wcześniej zakończyły się niepowodzeniem. Każde z zadań powinno wymagać od 1 do 3 "idealnych dni" do wykonania. Pisząc "idealny dzień" należy mieć na myśli czas, który należy poświęcić (- bez przerw) bez uwzględnienia niespodziewanych sytuacji, jakie mogą spowodować przerwanie pracy. Zadania, które trwają krócej niż 1 dzień, mogą zostać połączone w jedną wspólną grupę. Natomiast zadania, które trwają dłużej niż 3 dni powinny zostać ponownie rozpatrzone. Po wybraniu odpowiednich zadań i testów programiści podpisują się pod wybranymi ćwiczeniami i oceniają ile czasu zajmie im ich ukończenie. Ważny jest fakt, iż dana osoba podejmująca się odpowiedniego zadania sama musi określić jak długo może zająć jej jego wykonanie.

Prędkość projektowania, która została wcześniej określona jest używana, aby wyliczyć czy iteracja jest już zakończona czy może jeszcze nie. Jeśli bieżąca iteracja jest zbyt duża, klient musi wybrać część opowiadań do odłożenia na później. Jeśli iteracja jest za mała można zaakceptować inne opowiadania. „Prędkość w dniach i zadaniach ( -planowanie iteracji) ma większe znaczenie niż prędkość w tygodniach i opowiadaniach ( -planowanie publikacji), gdyż jest bardziej dokładna.”

Według praktyk, jakie stosuje się w metodologii XP należy zmieniać ludzi pracujących nad projektem, po to, aby uniknąć znaczącego odpływu wiedzy lub wystąpienia tzw. „wąskiego gardła kodowania”. Może zdarzyć się sytuacja taka, iż jedyna osoba, która pracuje nad wyznaczonym zadaniem, zdecyduje się odejść z zespołu. Wówczas można stwierdzić, że dany projekt wlecze się w „żółwim tempie”. Niektóre firmy często stosują tzw. "szkolenia poprzeczne", aby uchronić te obszary wiedzy, które łatwo mogą utracić. Kiedy zmienia się ludzi pracujących w obrębie głównego kodu programu, oraz dodatkowo łączy się to z programowaniem w parach, to stosuje się właśnie metodę "szkoleń poprzecznych". Sytuacja w takim przypadku zmienia się diametralnie z takiej, gdzie jedna osoba wie wszystko o danej sekcji kodu, na taką, gdzie wszyscy członkowie zespołu znają większą część tegoż kodu w poszczególnych sekcjach. W takim wypadku zespół jest o wiele bardziej "elastyczny”, oraz odporny na nieprzewidziane problemy związane chodź by z utratą jednego z członków grupy, ponieważ wszyscy posiadają wystarczającą ilość informacji o każdej części systemu, która jest opracowywana. Ponadto zamiast posiadać małą grupkę ludzi, którzy są przeciążeni pracą w trakcie, gdy reszta zespołu nie ma nic do roboty, można uczynić produktywnym cały zespół. Dowolna ilość programistów może zostać przypisania do najbardziej pracochłonnym i wymagających zadań. Płynne balansowanie takim przepływem ludzi jest spełnieniem marzeń większości menadżerów w firmach i korporacjach.

Tak jak wcześniej wspomniałem o zaletach szkoleń poprzecznych tak należy teraz wspomnieć o zastosowaniu programowania w parach. Dzięki stosowaniu tej metody mamy możliwość wymiany myśli i pomysłów, ponadto nie musimy martwić się o utratę produktywności pracy. Jeśli zajdzie taka potrzeba jedna osoba w parze może zawsze zostać wymieniona na inną, dzięki czemu nowa osoba wchodząca na miejsce poprzedniej ma możliwość zapoznania się z daną częścią kodu, nad, która dana para pracowała oraz dodatkowo może wprowadzić nowe i świeże pomysły do danego zadania.

Głównym założeniem tej praktyki jest jak najefektywniejsza komunikacja pomiędzy członkami zespołu. Codzienne poranne spotkania, mają głównie na celu wymianę informacji o napotkanych już problemach, możliwościach ich rozwiązań, a także motywowania całego zespołu do koncentrowania się na sprawach najistotniejszych. Wszyscy zebrani członkowie grupy projektowej stoją w kole, co pozwala uniknąć długich dyskusji i jest bardzo efektywne. W projekcie ceni się czas, bo „czas to pieniądz”, dlatego powszechnie uważa się, iż lepiej zorganizować jedno krótkie, ale obowiązkowe spotkanie, niż urządzać ich wiele, na których obecnych jest zaledwie kilku developerów. Takie spotkania mogą również być urządzane spontanicznie, przed komputerem, gdzie można na miejscu testować kod, a nowe pomysły od razu wcielać w życie.

Inaczej mówiąc usprawnij (-napraw) ten proces, kiedy zawiedzie. Można również wprowadzać zmiany, jeśli coś nie funkcjonuje prawidłowo. Należy wtedy przestrzegać reguł do momentu, gdy nie zmieni ich zespół. Trzymanie się ustalonego zestawu zasad to jedyny sposób, aby sprostać odpowiednim wymaganiom. Należy odbywać spotkania, na których można ustalić, co działa, a co nie oraz obmyślić możliwości ulepszania Extreme Programming.

1.4.2 Projektowanie - odpowiednie praktyki, wskazówki i szczegóły.

Nie od dziś wiadomo, iż ukończenie prostego projektu zawsze zabiera mniej czasu niż złożonego. Dlatego powszechnie uważa się, iż należy wykorzystać jak najprostszy wariant, który będzie działał zgodnie z naszymi założeniami. Jeśli zdarzy się, że natrafimy na coś skomplikowanego - powinno zamienić się to na jego prostszy odpowiednik. Zawsze szybciej i taniej jest pozbyć się złożonego kodu teraz, niż później, dzięki czemu możemy zaoszczędzić wiele czasu na późniejsze upraszczanie już wykorzystywanego kodu.

Przy pracach nad projektem często określa się system tzw. przenośni, aby zachować zgodność w nazywaniu klas i metod. To jak nazywane są obiekty jest bardzo ważne dla zrozumienia całego projektu systemu, a także późniejszego wielokrotnego używania kodu. Jeśli dzięki odpowiedniemu nazewnictwu możemy domyślić się jak coś zostało nazwane, zaoszczędzimy dużo czasu na jego zgadywanie. Opisy obiektów, powinny być tak nazwane, aby osoby, które chcą odnosić się do nich, mogły robić to bez potrzeby poznania dokładnej wiedzy na temat działania projektu. Przykładem takiego nazewnictwa był np. system rozliczeń firmy, Chrysler, który został zbudowany w oparciu o elementy linii produkcyjnej, z kolei u Forda samochody były sprzedawane jako struktury złożone z komponentów.

Dzięki takiemu rozwiązaniu można znaleźć wiele odpowiedzi na trudne problemy techniczne lub dotyczące samego projektu. Rozwiązanie impulsowe to bardzo prosty program, którego zadaniem jest wyszukiwanie potencjalnych rozwiązań danego problemu. Można np. zbudować system, który zajmuje się wyłącznie analizą problemu i pomija inne aspekty, jednakże większość tego typu programów nie jest wystarczająco dobra, by używać ich przez dłuższy czas, tak, więc nie należy się spodziewać, że dany program będzie pracował dla nas wiecznie, ponieważ w końcu będzie trzeba się go pozbyć. Głównym założeniem systemu jest zmniejszenie, na ile to tylko możliwe samego ryzyka wystąpienia problemów typu technicznego, a także zwiększenia wiarygodności oceny opowieści użytkowników. Kiedy trudności techniczne zagrażają rozwojowi systemu, wybiera się dwójkę programistów, którzy zajmą się tym problemem przez tydzień lub dwa i spróbują zmniejszyć potencjalne ryzyko wystąpienia tej awarii.

Większość ludzi kusi, aby dodać funkcjonalność teraz ( -wcześniej) niż później, ponieważ obecnie wie dokładnie jak jej użyć, a ponadto mogłoby to ulepszyć system. Takiej osobie wydaje się, że byłoby znacznie szybciej dodać ją właśnie teraz. Jednakże ludzie tacy muszą sobie cięgle powtarzać, że tak naprawę ta funkcjonalność nie będzie potrzebna. Dodatkowa funkcjonalność jedynie spowolni pracę takiej osobie, a możliwe również, iż całej grupie i dodatkowo zmarnuje zasoby.

1.4.3 Implementacja - odpowiednie praktyki, wskazówki i szczegóły.

Jednym z niewielu wymagań programowania ekstremalnego (XP) jest stała dostępność do klienta. Nie tylko po to, aby taka osoba mogła pomagać zespołowi wykonawców, ale również po to, aby stała się jego częścią. Wszystkie fazy projektu opartego o metodologię XP wymagają komunikacji z odbiorcą, najlepiej twarzą w twarz, na miejscu. Uważa się, iż najlepiej po prostu przypisać jednego lub kilku przyszłych użytkowników do zespołu. Przy okazji przypisywania, dużą uwagę zwraca się na to, aby osoby te znały się na rzeczy, a nie byli to jacyś praktykanci, których wyznaczono, nie chcąc marnować czasu bardziej wykwalifikowanych pracowników - „potrzebni są eksperci, a nie aktorzy ich grający!”

Podczas spotkań związanych z planowaniem wersji klienci uzgadniają, które z opowiadań mają być włączone do kolejnych wersji. Mogą oni także ustalić termin publikacji. Ponadto klienci podejmują te decyzje w oparciu o własne cele. Spotkania te są używane do określenia mniejszych, inkrementacyjnych publikacji, aby zapewnić jak najwcześniejsze dostarczenie pożądanej funkcjonalności do odbiorcy. Daje to użytkownikom możliwość wcześniejszego wypróbowania systemu i szybszego odzewu do developerów.

Ponieważ szczegóły są pomijane w opowiadaniach, developerzy będą musieli kontaktować się z odbiorcami w celu zebrania odpowiedniej liczby informacji, potrzebnych do opracowania zadań programistycznych - projekty na większą skalę wymagają stałego zaangażowania ze strony klienta.

Użytkownik także jest stale potrzeby do pomocy przy testach funkcjonalności, kiedy trzeba będzie stworzyć dane testowe, a zamierzone wyniki oszacować i zweryfikować. Testy funkcjonalności sprawdzają czy system jest gotowy do publikacji i wdrożania. Może zdarzyć się, że system nie przejdzie wszystkich testów wymaganej funkcjonalności, wtedy klient będzie musiał przejrzeć ich wyniki i zdecydować, czy zgodzi się na jego odbiór czy też wstrzyma wydanie.

Kod musi być formatowany zgodnie z przyjętymi przez grupę standardami i zasadami. Standardy te utrzymują cały zapis spójnym i łatwym do odszyfrowania oraz przebudowy dla całego zespołu.

Tworzenie testów znacznie pomaga programistom uzmysłowić sobie, co tak naprawdę mają wykonać. Bez testów programista może nie być pewny, czy to, co zrobił jest wystarczające. Konsekwencją takiego przypadku mogą być zbędne dodatki i nowe błędy. Jeśli stworzy się najpierw arkusz testujący to dokładnie deweloper wie, kiedy ukończył swoje zadanie -w przypadku, gdy wszystkie testy wykonały się poprawnie. Dodatkowo trzeba tu też nadmienić, że zyskuje także sam projekt systemu w wyniku jego prawidłowego, a nieraz i szybszego implementowania. Zdarza się jednak, że oprogramowanie, które jest tworzone jest na tyle skomplikowane, iż jego testowanie musi być odłożone na później. Takie systemy przeważnie opierają się na wczesnej implementacji i późniejszym testowaniu, często przez inny zespół. Poprzez tworzenie pierwszych testów z góry zostaje wywarty nacisk na sprawdzenia wszystkiego, co zostało stworzone i czego oczekuje klient. Odbija się to na projekcie, który sam staje się łatwiejszym do testowania, a kod, który będzie tworzony również będzie prosty i zwięzły.

Każdy kod dołączony do kolejnego wydania jest tworzony przez dwie osoby pracujące razem na jednym komputerze. Programowanie takie zwane potocznie „programowaniem w parach” zwiększa jakoś tworzonego oprogramowania nie wpływając przy tym na czas 0x08 graphic
jego dostarczenia. W wyniku doświadczeń, które odbywały się w wielu projektach wiadome jest, że dwie osoby, które pracują na jednym komputerze dostarczą tyle samo funkcjonalności, co dwie osoby pracujące oddzielnie, tyle, że w pierwszym przypadku kod będzie znacznie bardziej dopracowany.

Najlepszą metodą programowania w parach jest po prostu posadzenie obok siebie przed monitorem dwóch programistów, którzy będą przekazywać sobie myszkę i klawiaturę. Gdy jedna osoba pisze i myśli nad metodą, którą właśnie tworzy, druga w tej chwili myśli strategicznie o tym, jak ta metoda sprawdzi się w tej klasie i odwrotnie.

Bez kontrolowania integracji kodu źródłowego programiści po lokalnym przetestowaniu swojego kodu mogą umieszczać wyniki swoich prac w tzw. „publicznym repozytorium”. W wyniku takiego działania może zaistnieć wiele konfliktów, które ujawnią się w późniejszym czasie. W niektórych projektach, aby uniknąć tego typu nieprzyjemności, zdarza się, że developerzy opiekują się wydzielonymi klasami. Właściciele tych klas dbają o to, by ich kod był jasny, spójny i właściwie udostępniony. Takie działanie zmniejsza ryzyko, jednakże nie eliminuje całkowicie problemów związanych z powiązaniami pomiędzy klasami, które nadal mogą być niewłaściwe.

Do innych przypadków, jakie są stosowane przez grupy projektowe zalicza się wyznaczenie osoby tzw. „integratora” lub całej grupy osób, które zajmują się tylko i wyłącznie integracją. Takie podejście ma swoje minusy związane z tym, iż w jednym czasie do grupy osób może napłynąć zbyt duża liczba przetestowanych kodów gotowych do integracji, przez co cały proces integracji znacznie się wydłuża powodując zator w prawidłowym i płynnym działaniu całej grupy. Rozwiązaniem tego problemu jest ściśle sekwencyjna (lub jednowątkowa), samodzielna integracja kodu, przez programistów połączona ze zbiorową własnością. Cały kod źródłowy jest publikowany do repozytorium w turach, to jest, tylko jedna para programistów integruje, testuje i wprowadza zmiany w repozytorium w danej chwili. Taka kolejkowana integracja pozwala na jednoznaczne zidentyfikowanie ostatniej wersji systemu. Nie znaczy to, że nie można integrować swoich poprawek z ostatnią wersji, kiedy tylko zechcemy. Po prostu nie możemy publikować swoich zmian do repozytorium dla własnego zespołu, jeśli nie przyszła nasza kolej. Aby zastosować tzw. kolejkowanie w zespole można użyć fizycznego klucza ( -token) przekazywanego między developerami, lub przeznaczyć do tego jeden komputer, na którym dany zespół może pracować. Takie podejście plus częsta integracja i publikacja kodu skraca czas potrzebny na trzymanie blokady, a zatem także czas oczekiwania na otrzymanie pozwolenia na integrację.

Pojedynczy komputer służy do kolejnych publikacji oraz odgrywa rolę fizycznego dowodu kontroli tej publikacji. Dzięki niemu programiści mają możliwość zobaczenia ostatniego słowa w bieżącej konfiguracji.

Komputer umożliwia projektantom przekonanie się, kto i kiedy publikuje, przez co w danej chwili nie mogą wprowadzać dodatkowych zmian.

W miarę ciągła integracja pozwala na wczesne zapobieganie lub wykrywanie problemów z kompatybilnością. Chodzi tu o to, że znacznie łatwiej i bezpieczniej jest wprowadzać częściej drobne poprawki do głównego kodu niż za jednym zamachem, w chwili, gdy przychodzi czas oddania wyników, walczyć za wprowadzeniem opracowywanych w ciągu kilku ostatnich tygodni zmian do tego kodu, który na domiar złego już w tym czasie ewoluował. Dlatego zawsze należy pracować opierając się na aktualnej wersji systemu.

Developerzy powinni integrować i publikować kod do repozytorium, co kilka godzin, kiedy to tylko możliwe. W żadnym razie, nigdy nie powinni przetrzymywać zmienionej wersji dłużej niż jeden dzień. Ciągła integracja często pozwala uniknąć rozbicia prac developerskich oraz pozwala pracować na ostatniej, najnowszej wersji kodu. Wprowadzanie poprawek do i tak już nieaktualnego kodu źródłowego może tylko wprowadzić chaos i narobić problemów w momencie integracji.

Zbiorowa własność kodu motywuje wszystkich do zasilania projektu nowymi pomysłami. Dzięki niej każdy programista może zmienić dowolną linijkę kodu dodając nową funkcjonalność, poprawiając błędy lub przebudowując istniejące rozwiązanie.

Kiedy zapewnimy miejsce do działania, każdy będzie mógł wprowadzić zmiany w dowolnej metodzie którejkolwiek z klas i opublikować je do repozytorium kiedy zajdzie taka potrzeba. Gdy połączymy to z częstą integracją developerzy rzadko będą zauważać, iż klasa została rozszerzona czy poprawiona. W praktyce zbiorowa własność kodu lepiej się sprawdza niż umieszczanie pojedynczej osoby, mającej strzec odpowiednich klas. Zwłaszcza, że taka osoba może w każdej chwili opuścić nasz projekt.

Praca po godzinach wysysa ducha i motywację zespołu. Projekty, które wymagają nadgodzin, aby zostały ukończone na czas i tak się spóźnią, niezależnie od tego, co zostanie zrobione. Zamiast takiego podejścia należy jak najlepiej wykorzystać spotkania poświęcone planowaniu publikacji do zmian zakresu prac lub ich czasu.

1.4.4 Testowanie - wskazówki i szczegóły.

Arkusze testów są jednym z kamieni węgielnych programowania ekstremalnego (XP). Jednakże testowanie w XP nieco różni się od zwykłego testowania ze względu na to, iż najpierw tworzy się lub ściąga środowisko, które pozwoli je przeprowadzić w sposób automatyczny, a później testuje się wszystkie klasy w systemie. Proste metody typu get/set w testach są przeważnie pomijane. Arkusze testów są publikowane do repozytorium razem z kodem, który jest testowany. Kod, który nie jest pokryty testami nie może być opublikowany. Jeśli odkryje się, że jakiegoś testu brakuje, natychmiast się go tworzy.

Największą trudnością w prowadzeniu arkuszy testów jest nieubłagalnie zbliżający się „deadline”. Aby przyspieszyć przeprowadzanie testów, a co za tym idzie zaoszczędzić nieco cennego czasu stosuje się automatyczne testy, które potrafią wynajdywać błędy i zapobiegać nim. Im trudniej jest opracować określony test tym bardziej jest on potrzebny, gdyż zaoszczędzi on później grupie wiele czasu. Koszty potrzebne na tworzenie danych testów często zwracają się z nawiązką.

Do popularnych błędów w czasie tworzenie systemu dla klienta jest przekonanie, że testy mogą być pisanie w przeciągu trzech ostatnich miesięcy projektowania. Takie podejście jest dość ryzykowne, ponieważ bez arkuszy testów, prace developerskie przeciągają się, pochłaniając i te trzy miesiące, a nawet i więcej. Kiedy z kolei znajdzie się odrobina dostępnego czasu trzeba się liczyć z tym, iż aby powstały dobrej jakości testy potrzeba jeszcze dodatkowego czasu na to, aby one dojrzały. Odkrywanie potencjalnych problemów, które mogą wystąpić pochłania właśnie ten dodatkowy czas. Żeby testy były dostępne, kiedy będą potrzebne powinno zacząć się je tworzyć od zaraz.

Arkusze testów wspierają zbiorową własność kodu oraz umożliwiają refaktoryzację. Po każdej drobnej zmianie kodu, testy mogą zweryfikować i upewnić się, że zmiana w strukturze rozwiązania nie wpłynie na niepożądaną zmianę funkcjonalności. „Zbudowanie pojedynczego, uniwersalnego zestawu arkuszy testów do walidacji i testowania regresyjnego pozwala na częstą integrację kodu”. Można wtedy szybko zintegrować wszystkie ostatnie zmiany, po czym uruchomić najnowszą wersję zestawu testów. Jeśli kod nie przejdzie testu, oznacza to, iż jest niekompatybilny z poprzednią wersją. Wykorzystując automatyczne testowanie jest możliwe również dołączenie zbioru poprawek do ostatnio wypuszczonej wersji i opublikowanie ich w krótkim czasie. Częste dodawanie takich nowych funkcji wymaga zmiany arkuszy testujących, po to, aby te ogarnęły zmienioną funkcjonalność. Choć jest możliwe wprowadzenie błędu zarówno do kodu jak i do testu, w praktyce zdarza się to rzadko. Arkusze testujące zapewniają bezpieczną sieć testów regresyjnych i zatwierdzających, dzięki czemu można upraszczać i integrować kod bardzo efektywnie. Tworzenie takich arkuszy testów przed kodem ma jeszcze inne dodatkowe zalety, takie jak utrwalanie wymagań, przez co programiści mogą skupić się na konkretnym problemie.

Po ujawnieniu się określonego błędu w kodzie tworzone są odpowiednie testy, które mają za zadanie ostrzegać przed jego ponownym wystąpieniem. Błąd w wykonaniu wymaga testu akceptacyjnego, który będzie sprawdzał system pod jego kątem. Testy akceptacyjne tworzone jako pierwsze, jeszcze przed samym debugowaniem pozwalają użytkownikom na zwięzłe zdefiniowanie problemu i przedstawienie go programistom. Programiści z kolei mając wyszczególniony niespełniony test mogą skoncentrować swoje siły na rozwiązywaniu problemu i wiedzą, kiedy efekt zostanie osiągnięty. W przypadku, kiedy testy akceptacyjne zakończą się niepowodzeniem, developerzy tworzą mniejsze arkusze testujące, aby móc opisać defekt za pomocą większej ilości kodu i ukazać błąd z różnych punktów widzenia, w różnym kontekście. Obserwując interesujące nas arkusze testów można na bieżąco kontrolować, kiedy błędy zostaną poprawione. Gdy wszystkie arkusze przechodzą testy pomyślnie możemy ponownie uruchomić odpowiednie testy akceptacyjne by upewnić się, że problem na pewno został zażegnany.

Testy akceptacyjne tworzone są na bazie opowieści użytkowników. Podczas iteracji opowieści użytkowników (- wcześniej wybrane podczas spotkania planującego iterację) zostaną przetłumaczone na testy akceptacyjne. Kiedy opowieść zostanie prawidłowo zaimplementowana, użytkownik precyzuje scenariusz danego testu. Dana opowieść może mieć jeden lub więcej testów akceptacyjnych - tyle, aby mieć pewność, że funkcjonalność będzie działać prawidłowo. Testy akceptacyjne to „czarne skrzynki testów systemowych”. Każdy z tych testów ma za zadanie podać pewien oczekiwany wynik systemowy. Użytkownicy odpowiedzialni są za sprawdzanie prawidłowego przebiegu testów, a także za przegląd ich wyników. Te informacje pomagają im zdecydować o tym, które z oblanych testów są najważniejsze (najwyższej wagi). Testy akceptacyjne są także używane jako testy regresyjne stosowane jeszcze przed publikacją projektu.

Opowieść użytkownika nie jest uważana za kompletną, zanim nie przejdzie testów akceptacyjnych. Oznacza to, że dla każdej iteracji należy stworzyć nowy test akceptacyjny. W przeciwnym wypadku zespół developerów ogłosi zerowy postęp.

Gwarancja jakości (QA) jest zasadniczą częścią programowania w XP. Przy niektórych projektach QA jest przeprowadzana przez członków specjalnie do tego powołanej grupy, podczas gdy przy innych - grupa ta jest po prostu częścią grupy developerskiej.

Testy akceptacyjne powinny być zautomatyzowane po to, by można je często uruchamiać. Wynik testu akceptacyjnego ogłaszany jest zespołowi, którego zadaniem jest takie zaplanowanie czasu każdej iteracji, by poprawić wszystkie z oblanych testów. Testy akceptacyjne poprzednio nazywane były testami funkcjonalnymi.

1.5 Podsumowanie.

Głównym założeniem Extreme Programmig, podobnie jak Rational Unified Process było takie uproszczenie i pomoc ludziom w projekcie, aby możliwe stało się tworzenie oprogramowania jak najmniejszymi kosztami, a co za tym idzie eliminację jak największej liczby nie potrzebnych błędów. Można powiedzieć, że obie te metodyki stały się swoistymi zbiorami wiedzy, jak należy postępować w danym projekcie - zwłaszcza, że obie metodyki wywodzą się z obserwacji innych projektów, oraz wyciągania z nich odpowiednich lekcji. Jeśli chodzi o metodykę XP jest to właściwie zbiór zasad jak należy postępować. Niema tu wsparcia od strony odpowiednich programów - jak to ma miejsce w RUP-ie. Ponadto przez to, że XP - tak jak metodyki kaskadowe, jest darmowy - ma większą rzeszę ludzi, do których może on trafić, co wiąże się z tym, iż większa ilość ludzi może go używać. RUP przez to, że jest komercyjny i drogi w zakupie traci na swojej popularności, co w konsekwencji przemawia na jego niekorzyść.

W metodyce XP duży nacisk postawiono na komunikację - czego nie można powiedzieć o pozostałych metodologiach. Komunikacja w XP odbywa się nie tylko w obrębie danej grupy projektowej, ale również pomiędzy klientem a grupą. Takie podejście sprawia, że projektanci i programiści dokładnie wiedzą, czego oczekuje klient, co dodatkowo przyczynia się do rzadszych i mniejszych poprawek w systemie. Gdyby nie fakt, iż Extreme Programming lepiej radzi sobie z małymi i średnimi projektami mógłby być jednym z głównych metodologii stosowanych na świecie. Jednakże w wyniku braku odpowiedniego wsparcia narzędziowego dużym problemem staje się zastosowanie tej metodologii do dużych projektów, gdzie najlepsza do zastosowania jest metodyka Rational Unified Prosess.

II Rozdział - Metodologia Rational Unifed Process.

2.1 Wprowadzenie do Rational Unifed Process - krótka historia.

Rational Unifed Process (- w skrócie RUP) jest iteracyjną metodyką tworzenia oprogramowania stworzoną przez Rational Software Corporation, która stała się ważną metodyką w IBM (jest częścią Rational Method Composer [RMC], która pozwala na płynną ingerencje w proces). RUP nie jest sztywną metodyką, nakazującą tworzyć tylko i wyłącznie wytyczonymi ścieżkami, ale pozostawia wiele możliwości wyboru, eliminacji i adaptacji do istniejących warunków, zapotrzebowań. Zawiera uszeregowaną wiedzę, opartą na przykładowych schematach z wyszczególnionymi ścieżkami dla wielu rodzajów działalności.

Historia i podłoże RUP wywodzi się poniekąd ze spiralnego modelu Barrego Boehma, który wspólnie z Kenem Hartmanem stworzyli RUP-a. Pierwsza wersja (1995) nazywała się Rational Objectory Process (ROP) i budowano ją z myślą o obiektowości. W końcu pod kierownictwem Philippe Kruchten w 1998 ukazał się Rational Unified Process. Model był tworzony na podstawie analizy porażek wcześniejszych spokrewnionych modeli, twórcy sięgnęli do źródła by poznać przyczynę klęsk projektów. Czerpali też wiedzę z innych w tamten czas istniejących modeli. Główne przyczyny porażek jakie odkryli to :

Prześledzenie tych wad i ich analiza były głównym rdzeniem Rational Unified Process. Metodyka narodziła się w ten sam sposób jak inżynierowie tworzyli software - jest oparta na modelowaniu obiektowym i korzysta z UML-a.

2.2 Opis metodyki.

RUP nie jest jak książka - metodą wymyśloną raz i raz opublikowaną.

"Software processes are software, too" napisał Lee Osterwiel, profesor z University of Massachusetts co oznacza iż RUP został zaprojektowany, stworzony i wprowadzany jak każde inne narzędzie software'owe i posiada wiele podobieństw:

0x01 graphic

Rys. 7 - Przykładowa aplikacja wspomagająca proces projektowania w RUP.

2.3 Cechy charakterystyczne, architektura i zasada działania RUP-a.

Proces, który został ukazany na poniższym rysunku [Rys. 8] został zaprojektowany przy użyciu technik podobnych jak przy rozwoju software'u. Konkretnie, został oparty o UML. Rysunek ten przedstawia ogólną architekturę RUP-a, która składa się z dwóch struktur (wymiarów):

    1. poziomy wymiar - reprezentujący czas i ukazujący cykl życia oraz rozwój.

    2. pionowy wymiar - ukazujący przepływ (cykl) pracy rdzenia projektu, z uszeregowanymi logicznymi grupami aktywnymi według ich przyjętej natury.

0x01 graphic

Rys. 8 - Rational Unified Process.

Pierwszy wymiar reprezentujący dynamiczny aspekt procesu wyrażony w cyklach, fazach, iteracjach i kamieniach milowych. W RUP-ie produkt jest sukcesywnie budowany w oparciu o iteracje. To pozwala na testy i walidację zarówno zaprojektowanych pomysłów, jak i analizę ryzyka, która ujawni się we wczesnych fazach. Drugi wymiar reprezentuje zaś statyczny aspekt procesu opisanego w warunkach komponentów procesu: zadania, cykle, artefakty i role.

RUP = doświadczone techniki

RUP bazuje na wypracowanych nowoczesnych praktykach inżynierii programowania takich jak: iteracyjność, zarządzanie wymaganiami, architektura bazująca na komponentach, wizualizacja modelowania, bieżąco kontrolowana jakość, zmiany kontrolne w oprogramowaniu.

2.3.1 Iteracyjność

Większość grup programistycznych ciągle używa modelu kaskadowego w projektowaniu, wykonując w niezmiennej sekwencji fazy analizy wymagań, projektowania, implementacji, integracji i testowania. Ten mało wydajny system "usypia" kluczowych członków na dłuższe okresy i trzyma ich w tym stanie do końca cyklu projektu, kiedy problemy wydają się być ciężkie i nieopłacalne, a opóźnienia zaczynają zagrażać deadline'om. RUP, przeciwnie reprezentuje iteracyjne podejście, które jest lepsze z kilku powodów:

    1. Pozwala wdrożyć osoby do zmieniających się warunków.

Prawdą jest, że wymagania ciągle się zmieniają, łącznie z wykluczaniem tych mało istotnych i to one najczęściej są przyczyną opóźnień, niezadowolonych klientów i sfrustrowanych deweloperów.

    1. Integracja nie jest jednym "wielkim wybuchem" na końcu, zamiast tego elementy są integrowane progresyjne.

Z RUP-em to, co było ciągłą niepewnością i strachem odejmuje ok. 40% wysiłków na końcu - rozlatuje się na 6 do 9 mniejszych części integracji.

    1. Ryzyko jest zazwyczaj odkrywane albo adresowane podczas integracji.

Z iteracyjnym podejściem można zidentyfikować wcześniej ryzyko. Podczas prowadzenia wcześniejszych części integracji, testuje się wszystkie komponenty, doświadczając wiele aspektów projektu, takich jak narzędzia, oprogramowanie poza dziedzinowe, ludzkie umiejętności itd. W takim wypadku ryzyko jest realne, jednakże można je zignorować, a nieplanowane ryzyko przynosi mniejsze straty.

    1. Iteracyjne zarządzanie pozwala zarządowi taktycznie spojrzeć na zmiany projektu, bądź porównać z wcześniejszymi projektami. Daje to możliwość ukończenia projektu wcześniej ze zredukowaną funkcjonalnością - jeśli wymaga tego sytuacja.

    2. Łatwiej jest zidentyfikować bieżące elementy zaprojektowane częściowo albo rozpoznać je podczas planowania. Recenzje projektów we wczesnych fazach pozwalają architektom ukazać potencjalne okazje, które można odłożyć "na potem", a zająć się inną częścią projektu.

    3. Kiedy można poprawiać błędy po kilku iteracjach, architektura staje się bardziej spójna. Kiedy projekt migruje z początku do opracowania sprzeczności są wykrywane wcześniej, niźli później miałby powodować panikę.

    4. Deweloperzy zdobywają doświadczenie, a ich zróżnicowane zdolności są w pełni wykorzystane podczas całego cyklu. Testerzy zaczynają testować wcześnie, technicy zaczynają projektować wcześnie itp. W nie iteracyjnym środowisku, ci sami ludzie czekaliby na swoją kolej, planując, ale nie czyniąc większych postępów. Wcześnie wykrywamy potrzebę dodatkowych szkoleń, bądź zasobów ludzkich.

    5. Sam proces może być ulepszany i zmieniany przez cały czas.

Ostanie fazy w iteracji pozwalają nie tylko spojrzeć na to, co jest zrobione, ale i na to, co ma zostać zmienione w następnej kolejce.

9) Zarząd projektu często opiera się iteracyjności, widząc to jako rodzaj niekończącej się i niekontrolowanej ścieżki. W Rational Unified Process iteracyjność jest w pełni pod kontrolą; liczba, przebiegi i cele są skrzętnie planowane, a zadania i odpowiedzialność dobrze zdefiniowane.

2.3.2 Zarządzanie wymaganiami

Zarządzanie wymaganiami jest systematycznym podejściem aktywacji, organizacji, komunikacji i zarządzania zmianami wymagań. Korzyści są następujące:

    1. Lepsza kontrola nad całością projektu (większe zrozumienie zachowań systemu, jak i zapobieganiu poślizgom wymagań).

    2. Ulepszona jakość oprogramowania i zadowolenia klientów.

Fundamentalną metodą mierzenia jakości jest to czy system robi to, co powinien. Z RUP-em może to być łatwo wymierzone, ponieważ udziałowcy mają pojęcie o tym, co ma być zbudowane i przetestowane.

    1. Zredukowane koszta i opóźnienia.

Naprawianie błędnych wymagań jest bardzo kosztowne, z efektywnym zarządzaniem można zmniejszyć te błędy we wczesnych fazach.

    1. Poprawiona komunikacja zespołu.

Dobrze zarządzana specyfikacja wymagań, zrozumienie i postanowienia pośród udziałowców: użytkowników, klientów, zarządu, projektantów i testerów.

Ciężko jest zwykle spoglądać na tradycyjny obiektowo zorientowany model systemu i powiedzieć jak system robi to, co powinien. Ta trudność wywodzi się z braku konsekwencji i obawy przed podołaniem niektórych elementów. W RUPie use case'y niwelują obawę poprzez zdefiniowanie zachowania wykonywanego systemu.

Use case'y nie są wymagane w systemie obiektowo zorientowanym. Kiedy się jednak pojawiają kształtują ważne połączenie pomiędzy wymaganiami systemu a innymi artefaktami inżynierskimi, jak projektowanie czy testowanie.

RUP jest napędzany przez use-case'y co oznacza, iż odgrywają one główną rolę w przepływie pracy (workflow), zwłaszcza projektowaniu i testowaniu, projektowaniu interface'u użytkownika i zarządzania projektem. Są też niezbędne do modelowania biznesowego.

2.3.3 Architektura bazująca na komponentach.

Use case'y napędzają RUP-a poprzez cały cykl życiowy, lecz projektowanie koncentruje się na architekturze. Głównym celem we wczesnych iteracjach jest produkcja i walidacja architektury systemu. Na początku tworzy się prototyp, który z czasem przeradza się w finalny produkt.

Rational Unified Process dostarcza metodologii, systematyki w projektowaniu, rozwoju i walidacji architektury. Oferuje szablony do opisu architektury bazującej na koncepcji widoku wielorakich architektur. Projektowanie komponentu składa się ze specjalnych czynności, których celem jest identyfikacja restrykcyjności i znaczenia różnorakich elementów architektury, jak i pomocy, co do jej wyborów. Komponentem może być istotny element software'u: moduł, zestaw, albo podsystem, który wykonuje jakąś funkcję, ma jasną budowę i może być zintegrowany do wymaganej architektury. Projektowanie komponentowe może być zrealizowane w kilka sposobów:

    1. W definicji modularnej architektury, identyfikacji, izolacji, projektowaniu, rozwoju i testowaniu jako w pełni ukształtowany element.

Elementy te mogą być oddzielnie testowanie i zintegrowane później z systemem.

    1. Komponenty powinny być projektowane, tak, aby można ich było użyć ponownie. Takie komponenty są zazwyczaj większe niż proste narzędzia, czy biblioteki. Zawierają one pewne metody, często strzeżone, jakie stosuje się wewnątrz organizacji, ukazujące jej jakość i pozycję.

    2. W chwili obecnej można łatwo zauważyć sukces takich większych komponentów jak np. CORBA, ActiveX, JavaBeans; bez których można się obejść, jednakże znacznie ułatwiają nam życie.

Ostatnie punkty ukazują przejście z programowania strukturalnego/obiektowego na komponentowe.

- Iteracyjność pozwala deweloperom na progresywną identyfikację komponentów i decyzje, który rozwijać dalej, którego użyć ponownie, a który zakupić.

- Skupienie się na architekturze pozwala na artykulację struktury. Architektura spaja komponenty i sposób, w jaki są zintegrowane, jak i fundamentalny mechanizm wzorców, z którymi współdziałają.

- Pomysły takie jak zestawy, podsystemy i warstwy są używane podczas analizy i projektowania dla organizacji komponentów i specyfikacji interface'ów.

- Testowanie i organizacja najpierw pośród pojedynczych komponentów, a później z pośród większych zbiorów.

2.3.4 Wizualizacja modelowania.

Modele są uproszczeniem rzeczywistości, pomagają nam zrozumieć kształt problemu jak i rozwiązania. Dzięki nim możemy w łatwy sposób ogarnąć rozumem wielkie systemy. Należy tu wspomnieć, iż dużą częścią RUP'a stanowi właśnie rozwój modeli.

Do pomocy w wizualizacjach modelowania służy w Rup'ie właśnie UML, który jest niczym innym jest graficznym językiem dla wizualizacji, specyfikacji, konstrukcji i dokumentacji artefaktów systemów oprogramowania ( -np. RUP2000 korzysta z UML ver 1.4.). Daje on standardowe zrozumienie planu systemu, pokrywając konceptualne fragmenty jak procesy biznesowe i funkcje systemowe, oraz również klasy zawarte w konkretnym języku programowania, schematy bazodanowe i komponenty do ponownego użytku. RUP opisuje, jakiego modelu potrzebujesz, dlaczego i jak go zrealizować.

2.3.5 Bieżąco kontrolowana jakość.

W metodyce Rational Unified Process nie występuje stanowisko kontrolera jakości ze względu na to, iż jest za nią odpowiedzialny każdy członek zespołu. W inżynierii oprogramowania, skupia się uwagę na dwóch aspektach: jakości produktu i jakości procesu.

2.3.6 Zmiany kontrolne w oprogramowaniu

Właściwie w iteracyjnym projektowaniu produkty często ulegają zmianom. By zapewnić łatwość planowania i wykonywania rozwoju poprzez możliwość rozwoju wymagań, iteracyjność nakłada nacisk na pozostawanie na właściwej ścieżce i dbaniu, aby każdy podlegał synchronizacji. Proces jest przygotowany na systematyczne zmiany, utrzymuje ścieżkę wolną od błędów, nieporozumień, lecz również od postanowień.

2.4 Podsumowanie.

Jak już wspomniałem w podsumowaniu poprzedniego rozdziału, zarówno RUP, jak i XP wywodzą się z obserwacji innych projektów. Co do dalszej genezy tych dwóch metodologii to można powiedzieć, że poszły one w radykalnie różnych kierunkach. W wyniku tego, iż RUP został przejęty przez firmę IBM stał się on produktem typowo komercyjnym, który jest wspierany przez szereg narzędzi - dlatego też jest on najlepszy do zastosowanie przy dużych projektach, niezależnie jak są one zidentyfikowane, czego niemożna powiedzieć o podejściu kaskadowym. Ponadto w wyniku swojej skrupulatności, która objawia się tym, iż sam RUP posiada w sobie 40 ról i dostarcza 80 artefaktów staje się on dość dokładny przy zastosowaniu w projekcie. To, na czym głównie skupia się ta metodyka to na odpowiedniej i dogłębnej standaryzacji, przez co częściej podczas tworzenia danego systemu mogą wyjść wszelkie problemy z integralnością całości, czego niemożna powiedzieć o dwóch pozostałych metodykach, w których takiego podejścia brak. Co do wad metodyki Rational Unified Process to możemy tu zaliczyć zbyt wysoki koszt zakupu tej metodyki, która jest w zasięgu ręki tylko dla większych firm i korporacji oraz brak pełnej komunikacji jaka objawia się w metodologii Extreme Programming i która jest bardzo pomocna podczas procesu produkcyjnego.

III Rozdział - Kaskadowe metody w tworzeniu oprogramowania.

3.1 Co kryje się pod pojęciem „model kaskadowy”.

Model kaskadowy (ang. waterfall approach) zwany inaczej wodospadowym jest jednym z pierwszych podejść, jakie inżynierowie stosowali przy produkcji oprogramowania. Jego nazwa została wprowadzona przez Winstona W. Royce w roku 1970, w czasie, kiedy Inżynieria Oprogramowania dopiero, co się rodziła, w artykule "Managing the Development of Large Software Systems" (zarządzanie tworzeniem dużych systemów informatycznych). Nazwa tego podejścia pochodzi od struktury, która przypomina formą właśnie wodospad lub kaskadę, gdzie tak jak woda spływa w dół kaskadowo tak inżynierowie postępują w projekcie - punkt po punkcie po kolei. Sam model jest dość prosty i łatwy do zastosowania w grupie projektowej. Niestety łatwość i prostota w tym modelu nie idą w parze z brakiem błędów i problemów. Podejście to stosuje się rzadko, głównie jednak w projektach o dobrze zdefiniowanych wymaganiach dla dobrze rozumianych zastosowań. Należy tu również wspomnieć, iż w podejściu tym niema wyznaczonych konkretnych narzędzi do pracy. Stosuje się takie narzędzia, które są odpowiednie dla poszczególnych grup projektowych. W obecnym czasie dość dużą popularnością cieszy się tu język UML, o którym była mowa już wcześniej, w samej metodyce RUP.

3.2 Ogólny opis cech podejścia kaskadowego.

Usługi, ograniczenia i cele systemu są ustalane w czasie narad z użytkownikami tegoż systemu, następnie są szczegółowo definiowane i służą jako specyfikacje do tworzenia danego produktu.

Proces projektowania systemu prowadzi do podziału wymagań na systemy sprzętu i oprogramowania. Po ustaleniu odpowiednich wymagań i podziale na systemy tworzy się ogólną architekturę tworzonego produktu. Projektowanie oprogramowania obejmuje identyfikowanie i opisywanie zasadniczych abstrakcji danego systemu i związki, jakie występują między nimi.

W tym kroku projekt oprogramowania jest realizowany w postaci zbioru programów albo jednostek programów. Testowanie jednostek polega na sprawdzeniu, czy każda z nich spełnia swoją specyfikację. Jeśli spełnia możliwe jest przejście do integracji tychże jednostek.

Jednostki lub zbiory programów są integrowane i testowane jako kompletne systemy, po to, aby upewnić się czy spełniono wszystkie założenia wymagań. Po zakończeniu integracji i pomyślnym przejściu fazy testowania system jest dostarczany klientowi jako gotowy produkt.

Zwykle jest to najdłuższa faza życia produktu. System jest zainstalowany i przekazany do praktycznego użytkowania. Pielęgnacja jego obejmuje poprawianie błędów, których nie wykryto we wcześniejszych fazach życia, poprawianie implementacji jednostek systemu i wzbogacanie usług w miarę odkrywania nowych wymagań.

3.3 Model kaskadowy - rodzaje i zastosowanie.

Obecnie stosuje się dwa modele kaskadowe, które są używane do prac w projektach. Poza ogólnym podobieństwem w strukturze obydwu tych modeli wynikającym z tych samych faz projektu, reszta elementów, a zwłaszcza możliwości postępowania znacznie odbiegają od siebie. Główne różnice i wygląd samych modeli zostaną przedstawione poniżej.

3.3.1 Kaskadowy model bez iteracji.

0x01 graphic

Rys. 9 - Podejście kaskadowe bez iteracji

Przy stosowaniu tej metody czynności związane z cyklem życia projektu wykonywane są w pojedynczej, liniowej sekwencji dla wszystkich wymogów. Prowadzi to często do odkrywania podczas testów (- kiedy integrowane są poszczególne fragmenty systemu) szeregu problemów związanych z jakością i odpowiednią funkcjonalnością produktu, które pozostawały w ukryciu podczas czynności projektowania i implementacji. Ponieważ problemy te są odkrywane na późnych etapach procesu rozwoju projektu, może być za późno na ich rozwiązanie lub koszty rozwiązania mogą być zbyt wysokie. Dla przykładu - odkrycie, iż dany system zarządzania bazą danych ma za małą wydajność dla korzystających z niego aplikacji, gdy aplikacje te zostały juz opracowane, stanowi kolosalny problem.

W punkcie tym należy również rozważyć projekt obejmujący 10 wymagań, na przykład generowanie 10 różnych typów raportów, z których każdy bierze się z innego wymagania. Przy podejściu kaskadowym wszystkie te wymogi są rejestrowane i analizowane, a cały system jest projektowany, implementowany, testowany i wdrażany w jednej liniowej sekwencji. W takim przypadku, kiedy zastosuje się UML-a można z łatwością posłużyć się nim do przekazywania wymogów i opisów systemu. Ponieważ jednak czynności wykonywane są dla wszystkich wymogów w jednej liniowej sekwencji, modele UML-owe na każdym kolejnym kroku musza być dość kompletne. Taki poziom kompletności często trudno jest zmierzyć, a przed wszystkim osiągnąć, wprawdzie UML jest bardziej precyzyjny od języków naturalnych, lecz zarazem mniej precyzyjny od języków programowania, co wpływa na poziom kompletności opisów systemu. Zamiast wiec koncentrować się na systemie, zespoły projektowe korzystające z UML-a przy podejściu kaskadowym poświęcają swój czas na ustalenie, czy ich modele UML-owe są wystarczająco kompletne, w wyniku, czego cenny czas, który mogliby poświęcić na prace przy samym produkcie, poświęcają na badanie jakości i kompletności swoich opisów, co w konsekwencji przyczynia się na możliwość wydłużenia długości prac nad danym produktem. Oprócz poświęcenia czasu na samo sprawdzanie kompletności opisów, przychodzi jeszcze problem z poświęceniem czasu nad samym ich tworzeniem, gdyż w wyniku takiej a nie innej budowy tegoż podejścia wymagane jest, aby wynikiem każdej fazy był, co najmniej jeden dokument, który musi zostać oczywiście zaakceptowany. Kiedy dana faza zostanie już zaakceptowana prace mogą posunąć się dalej do następnych etapów produkcji systemu. W praktyce etapy te jednak zazębiają się i przekazują sobie nawzajem informacje. Proces ten nie jest prostym modelem liniowym, ale obejmuje ciąg iteracji czynności tworzenia. Koszty opracowania takich dokumentów są wysokie i dlatego iteracje są też kosztowne i wymagają powtórzenia wielu prac. Często po wykonaniu kilku iteracji pozostawia się problem do późniejszego rozwiązania, pomija lub rozwiązuje się go metodami poza modelowymi. Takie podejście powoduje ryzyko powstania złej struktury systemu lub otrzymanie systemu, który nie będzie robił tego, co chce użytkownik.

3.3.2 Kaskadowy model z iteracjami.

Podstawową wadą podejścia bez iteracji jest to, iż zaplanowane fazy pracy mają odbywać się po kolei, a powrót do wcześniejszej fazy traktuje się jako nieprawidłowość, która jest realizowana w sytuacji awaryjnej. W wyniku takiego postępowania i pewnych niedogodności wynikłych z samej budowy pierwszego podejścia, stworzono drugi model, tym razem z iteracjami. W modelu z iteracjami z góry przewiduje się tzw. powroty, dzięki czemu daje to większą elastyczność w projekcie.

0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x01 graphic

Rys. 10 - Model kaskadowy z iteracjami.

Gdy stosujemy metodę iteracyjną, wszystkie podzbiory czynności w cyklu życia projektu są wykonywane kilkakrotnie, aby lepiej zrozumieć wymogi i stopniowo opracować bardziej niezawodny system. Każde przejście cyklu tych działań lub ich podzbioru nosi nazwę iteracji, a seria iteracji w końcu krok po kroku doprowadza do ostatecznego systemu. Pozwala to lepiej zrozumieć wymogi i stopniowo stworzyć bardziej odpowiedni system przez kolejne ulepszenia i przyrostowe zwiększanie szczegółowości w miarę kolejnych iteracji. Dla potwierdzenia tychże stwierdzeń mogę posłużyć się tu znanym przykładem bazy danych z poprzedniego modelu. W tym wypadku, kiedy tworzymy system zarządzania, możemy zbadać wydajność określonego systemu zarządzania bazami danych i odkryć, iż będzie niewystarczająca dla korzystających z niego aplikacji, jeszcze zanim aplikacje te zostaną w pełni skonstruowane. Pozwoli to wprowadzić odpowiednie zmiany w aplikacjach lub zbadać inny system zarządzania bazą danych, zanim będzie na to za późno lub stanie się to zbyt kosztowne.

Tak, więc analizując powyższy przykład, który obejmuje generowanie 10 różnych typów raportów, dochodzimy do konkluzji, iż możliwy jest następujący ciąg iteracji:

1. Identyfikujemy pięć wymogów (nazwanych od W1 do W5) i analizujemy trzy z nich

(np. W1, W3 i W5).

2. Rejestrujemy pięć kolejnych wymogów (nazwanych od W6 do W10), analizujemy dwa nie przeanalizowane w poprzedniej iteracji (W2 i W4) oraz projektujemy, implementujemy i testujemy system, który spełnia trzy wymagania przeanalizowane w poprzedniej iteracji (W1, W3 i W5) oraz dwa przeanalizowane w tej iteracji (W2 i W4), lecz nie wdrażamy systemu, ponieważ w bieżącej iteracji nie przeznaczyliśmy na te czynność wystarczająco dużo czasu.

3. Wdrażamy system spełniający pięć wymogów przetestowanych w poprzedniej iteracji (od W1 do W5) i kontynuujemy prace nad pozostałymi (od W6 do W10).

4. Dalej pracujemy nad systemem, lecz musimy zająć się zmianami w jednym z wdrożonych juz wymogów (np. W3), zmianami w innych wymogach, które nie zostały jeszcze wdrożone (np. W6 i W10) oraz innymi technicznymi zmianami w systemie.

Ten ciąg iteracji może sprawiać wrażenie chaotycznego, jednakże podejście iteracyjne jest tylko ideą, a UML tylko językiem, wiec do zastosowania UML-a w rzeczywistym projekcie niezbędna jest metodologia. Iteracje wykorzystywane przez metodologie nie są chaotyczne, lecz zorganizowane i dość dynamiczne w ramach kontekstu tej metodologii.

Podejście iteracyjne do konstruowania systemu przynosi następujące korzyści:

Proces iteracyjny jest przyrostowy, ponieważ nie przerabiamy jedynie raz za razem tych samych wymogów w kolejnych iteracjach, lecz zajmujemy się w nich coraz większą liczbą wymogów. Oprócz tego w jednej iteracji mogą odbywać się równoległe czynności - jeśli koncentrują się na różnych częściach systemu i nie kolidują ze sobą. Wobec tego, chociaż podejście to określane jest często iteracyjnym i przyrostowym, w rzeczywistości jest iteracyjne, przyrostowe i równoległe. Ponieważ w tej metodzie system tworzony jest przez kolejne udoskonalenia i zwiększaną przyrostowo liczbę szczegółów, łatwiej jest nam ustalić wystarczający poziom kompletności modelu UML niż w samym podejściu kaskadowym.

Na przykład, jeśli mamy pytanie lub problem, którym należy się zając, i jeśli nie jesteśmy w stanie użyć do tego posiadanego modelu UML, to być może musimy rozbudować model, w przeciwnym razie możemy iść dalej bez poświęcania dodatkowych nakładów czasu i pracy na rozwój modeli UML.

3.4 Porównania.

Podejście kaskadowe

Podejście kaskadowe z iteracjami.

- zaplanowane fazy pracy muszą być realizowane po kolei,

- powroty do wcześniejszych faz traktuje się jako sytuacje niedobrą, niepożądaną, czyli inaczej mówiąc sytuację awaryjną.

- prace w tym podejściu zależą głównie od grupy projektowej i projektu, jaki jest realizowany,

-występują tu powroty, które są przewidziane. Daje to większą elastyczność podczas prac w projekcie.

Tab. 2 - Porównanie podejść. (*Opracowanie własne)