Zaawansowana in ynieria oprogramowania Początki
Transkrypt
Zaawansowana in ynieria oprogramowania Początki
Wydział Informatyki PB Początki programowania ekstremalnego Zaawansowana inżynieria oprogramowania • Powstało w wyniku obserwacji tradycyjnych procesów poprzez eliminację elementów spowalniających tworzenie oprogramowania i położenie szczególnego nacisku na elementy zwiększające wydajność, efektywność i jakość oprogramowania – syndrom LOOP (Late, Over budget, Overtime, Poor quality) • Relatywnie nowa tzw. lekka (lub zwinna) metodyka opisująca proces tworzenia oprogramowania • XP narodziło się w środowisku programistów Smalltalk-a; Kent Beck i Ward Cunningham opracowali zestaw dobrych praktyk programistycznych, które miały zwiększyć efektywność tworzenia oprogramowania. • Wg K. Beck-a XP jest to “skuteczny, bezpieczny, elastyczny, naukowy i przyjemny sposób programowania” • Pierwszy projekt (C3 - Chrysler Comprehesive Compensation) oparty na wypracowanych zasadach zrealizowano w drugiej połowie lat 90-tych Wykład: “Programowanie ekstremalne (ang. eXtreme Programming)” Marek Krętowski pokój 206 e-mail: [email protected] http://aragorn.pb.bialystok.pl/~mkret Wersja 1.11 Zaawansowana inżynieria oprogramowania Programowanie ekstremalne Czym XP rożni się od innych metodyk? • Programowanie ekstremalne jest to realna koncepcja określająca metodologię tworzenia wysokiej jakości oprogramowania. • Zorientowana na czynnik ludzki, starająca się maksymalnie zaadaptować do naturalnych cech ludzi a nie im przeciwdziałać. • Fundamentalne założenia XP: – – – – praca z rzeczywistymi klientami zamiast ze specyfikacją, wyprzedzające tworzenie testów, wstępne opinie użytkowników (historie, opowieści), wyeliminowanie niepotrzebnych działań • Założenia te, jako fundamentalne, pozostają niezmienne dla każdego projektu XP. Ponieważ jednak jest to metodologia otwarta, a przy tym młoda, reszta czynników wciąż ewoluuje. • Ekstremalność ma nawiązywać do sportów ekstremalnych (intensywność, odwaga, ...) Zaawansowana inżynieria oprogramowania • Wczesne, konkretne i ciągłe informacje zwrotne w krótkich cyklach programowania • Planowanie przyrostowe • Zdolność do elastycznego projektowania i implementacji funkcjonalności w zależności od dynamicznie zmieniających się wymagań • Opieranie się na automatycznych testach napisanych wspólnie z klientem • Opieranie się na komunikacji słownej i kodzie źródłowym oprogramowania w celu przekazania intencji programistów i klienta • Zapewnienie bliskiej współpracy programistów • Promowanie prostoty rozwiązań i iteracyjnego procesu poprawy zaimplementowanych rozwiązań • ... Zaawansowana inżynieria oprogramowania 3 /26 Pięć wartości XP 4 /26 Zespół klientów • Komunikacja - ścisła, bezpośrednia współpraca pomiędzy programistami i klientem • Prostota - poszukiwanie najprostszego rozwiązania spełniającego wyznaczone założenia, skupienie się na tym co w danej chwili jest potrzebne • Informacja zwrotna - szybkie iteracje i bezpośredni kontakt umożliwiają uzyskiwanie niemalże natychmiastowych informacji na temat stanu projektu i aktualnie istniejących zagrożeń • Odwaga - szybkie podejmowanie decyzji; agresywność i brak oporów przed zmianami mogącymi wpłynąć na jakość, termin i koszt oprogramowania • Szacunek – wzajemny szacunek członków zespołu (zarówno klientów jak i informatyków); szanowanie czasu i pracy innych Zaawansowana inżynieria oprogramowania 2 /26 5 /26 • Opowiadacze - (storyteller), osoby merytorycznie znające dziedzinę problemu – przekazują szczegółowe wymagania odnośnie rozwiązywanych problemów w postaci historii użytkowników (user stories) - elementarnych scenariuszy podstawowych funkcji systemu – do nich kierowane są pytania dotyczące niejasności – czuwają nad właściwym kierunkiem prac programistów (zbieżność implementacji z koncepcją) – określa się ich mianem dawców złota • Akceptanci - weryfikuje zgodność tego co powiedzieli opowiadacze z tym, co stworzyli programiści – przeprowadzają testy akceptacyjne • Posiadacze złota - dostarczają zasobów do tworzenia systemu – do ich zadań należy zatrudnianie ludzi, zapewnianie funduszy oraz odpowiedniego wyposażenia • Planiści - synchronizuje cykl wdrażania systemu z normalną pracą przedsiębiorstwa – odpowiednikiem w zespole programistów jest tropiciel • Wielki szef - człowiek sprawujący generalny nadzór nad wszystkimi pracami związanymi z powstawaniem systemu – pracuje na potrzeby obydwu zespołów – odpowiada za klarowną organizację całego przedsięwzięcia Zaawansowana inżynieria oprogramowania 6 /26 Prawa i obowiązki klientów Zespół programistów • • Obowiązek stworzenia wspólnie z programistami jasnej czytelnej specyfikacji wymagań • Prawo do informacji jaki jest koszt, czas implementacji poszczególnych funkcjonalności i jaki nakład pracy potrzebny jest do osiągnięcia poszczególnych celów • Prawo do obserwacji postępu prac poprzez ewaluację dostarczanych w kolejnych iteracjach działających części systemu • Prawo do potwierdzenia jakości systemu poprzez wykonanie serii testów • Prawo do zmiany zdania, podmiany wymagań i zmiany priorytetów • Prawo do informacji o zmianach planu, ewentualnych opóźnieniach, zmianach estymacji tak aby możliwa była zmiana zakresu w celu uzyskania interesującej funkcjonalności w założonym czasie i budżecie Zaawansowana inżynieria oprogramowania • – odpowiedzialny za płynny przebieg projektu, • Tropiciel - stanowi sprzężenie zwrotne pomiędzy planistą a programistami – jego zadaniem jest zweryfikowanie realności przyjętych założeń (głównie pod kątem szybkości prac) Negocjator - zapewnia należytą komunikację pomiędzy zespołem programistów i zespołem klientów – poza tym odpowiedzialny jest za komunikację wewnątrz zespołów; do jego zadań należy organizowanie większych zebrań – decyduje w sytuacjach kryzysowych – rozsądzanie sporów, osiąganie kompromisów • – posiada wizję całości systemu, intuicyjnie wyczuwając jak ryzykowne są poszczególne etapy Architekt - buduje elastyczną strukturę programu, która łatwo poddaje się refaktoryzacji; jego zadania: – opracowanie minimalnej liczby testów potrzebnej do weryfikacji poprawności architektury w jej aktualnej wersji – ma również informować planistę o postępach – wykrycie wszystkie defekty w kodzie Zaawansowana inżynieria oprogramowania 7 /26 Reguły i praktyki XP 8 /26 Historie użytkowników (www.eXtremeProgramming.org) • • Zaawansowana inżynieria oprogramowania Trener - służy programistom doświadczeniem zawodowym, 11 /26 Tworzenie oprogramowania w XP odbywa się przyrostowo przez wdrażanie kolejnych wydań produktu. Planowanie wydania odbywa się przed rozpoczęciem każdej nowej iteracji. Podstawowym celem jest oszacowanie każdej pojedynczej historii użytkownika, powstałej w wyniku gry planistycznej z klientem. Do szacowania używa się jednostek zwanych idealnymi osobo-tygodniami. Idealny osobo-tydzień to tydzień pracy wyłącznie nad programem, bez dodatkowych zajęć, ale wliczający czas testowania programu. • Spisywane historie (scenariusze) użytkowników (ang. user stories) – podobne trochę do przypadków użycia (UML), ale zdecydowanie krótsze i pisane językiem zrozumiałym dla klienta, stanowią formalny dokument wymagań – stanowią podstawę dla planowania i podziału zadań oraz dla testów akceptacyjnych – klient określa, które historie są dla niego najważniejsze i które powinny być realizowane w pierwszej kolejności – projektanci mogą stwierdzić, ze przedstawiona historia jest zbyt duża i poprosić użytkownika o podzielenie jej na mniejsze części. Zaawansowana inżynieria oprogramowania 12 /26 Stały kontakt z klientem Prostota rozwiązań • Potrzebny jest jak najszerszy kontakt z klientem. Jeżeli jest on jednak nieosiągalny, może to prowadzić do opóźnień w realizacji systemu (czy wręcz fiaska) • Najlepiej jeśli klient dostępny jest przez cały projekt, w idealnym przypadku pracuje w tym samym pomieszczeniu co zespół projektowy (ang. on-site customer) • Aby zadowolić wymagania klienta należy bezwzględnie podążać za jego życzeniami • Niektórzy twierdzą, że klient nie jest poważny, jeżeli nie może poświęcić wystarczająco dużo czasu dla nowego systemu. Zaawansowana inżynieria oprogramowania 13 /26 Prototypowanie • “Nigdy nie projektuj funkcjonalności, która może nigdy nie zostać wykorzystana” • XP zakłada, że wymagania klienta, rynku i sytuacja w branży ciągle się zmieniają. Nie ma więc sensu planować rozwiązań, o których nie wiadomo, czy zostaną wykorzystane w przyszłości • Celem XP jest jak najszybsze i najprostsze osiągniecie satysfakcji klienta przez dostarczenie oprogramowania, spełniającego postawione wymagania • Programista implementując stara się osiągnąć sukces przy minimalnych nakładach “Always do the simplest thing that could possibly work” • Jeśli jednak okaże się, że projektowane rozwiązanie jest zbyt uproszczone może zostać szybko zmienione i rozszerzone Zaawansowana inżynieria oprogramowania 14 /26 Refaktoryzacja • Minimalizacja ryzyka poprzez budowę prototypów (ang. spike solutions) • Prototypowanie dla zagadnień stanowiących potencjalne ryzyko wystąpienia problemów z implementacją • Prototyp powinien tylko obejmować zagadnienia związane z ryzykiem i nic poza tym • Prototypowanie powinno się zakończyć w momencie uzyskania odpowiedzi, że dany problem można rozwiązać • Nigdy nie powinno się wykorzystywać kodu prototypu w produkcji! • “Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure” (Martin Fowler): – upraszczanie, restrukturalizacja kodu; – zmiana istniejącej implementacji w celu umożliwienia rozbudowy o nową funkcjonalność; – dostosowanie kodu do przyjętych standardów; • Sesje refaktoringowe powinny być przeprowadzane regularnie w trakcie trwania projektu • Korzystanie z narzędzi wspomagających wprowadzanie jednoczesnych zmian w całym kodzie “Build one to throw away” – np. zmian sygnatur metod w deklaracji klasy i klasach wykorzystujących te metody • Nigdy nie należy refaktoryzować kodu, dla którego nie istnieją testy Zaawansowana inżynieria oprogramowania Refaktoryzacja 15 /26 16 /26 Programowanie w parach (2) • Sednem jest stosowanie niewielkich transformacji (nazywanych refaktoryzacjami) niezmieniających zachowania (funkcjonalności) po których następuje kontrolne uruchomienie testów jednostkowych – seria refaktoryzacji może zmieniać istotnie (poprawić) strukturę kodu – przykładowe transformacje: ekstrakcja metody (lub stałej), wprowadzenie zmiennej objaśniającej • Typowe (przykładowe) cele refaktoryzacji: – usunięcie powtórzeń kodu, poprawa czytelności, skrócenie kodu metod, usunięcie zakodowanych „na sztywno” stałych, ... • Zapaszek (brzydki) kodu (ang. code smells) – określenie (metafora) używane w celu opisania kodu wymagającego (zapewne) refaktoryzacji; czasami może też być smrodek kodu (ang. code stench) – kod nieodwołalnie wymaga poprawy – przykłady zapaszków:powtórzony kod; duża metoda;uderzająco podobne klasy; klasa z ogromną ilością kodu.... Zaawansowana inżynieria oprogramowania Zaawansowana inżynieria oprogramowania 17 /26 • Podczas gdy jedna osoba pisze kod, druga na bieżąco go sprawdza, sugeruje możliwe rozwiązania, może służyć pomocą i zwraca uwagę na błędy syntaktyczne • PP jest dość trudne, wymaga dobrego zgrania zespołu, ale przynosi wymierne korzyści w postaci lepszego kodu • PP pomaga również w dokonywaniu poprawek; druga osoba może bowiem wiedzieć więcej o danym fragmencie kodu • programiści wewnątrz pary powinni co jakiś czas zamieniać się miejscami; w ten sposób wysiłek jest rozłożony równomiernie • Ponadto pary powinny się między sobą mieszać (brak stałych partnerów dotyczy tylko programowania!) • Generalnie PP pomaga propagować wiedzę o różnych fragmentach programu na cała grupę osób, pracujących przy systemie Zaawansowana inżynieria oprogramowania 18 /26 Standard kodowania Stabilne i przewidywalne tempo pracy • XP narzuca wszystkim programistom wspólny standard kodowania i dokumentowania - eliminuje to nieporozumienia i ułatwia rozumienie kodu zwłaszcza przy PP • Standard taki powinien być ustalony i zaakceptowany przez cała grupę • Swego rodzaju symbolem, znakiem rozpoznawczym XP, stało się wymaganie odpowiedniego rytmu pracy (np. w postaci 40-to godzinnego tygodnia faktycznej pracy) • Zespoły programistów powinny być przyzwyczajone do stałej wydajności i stałego obciążenia. • Częsta praca w nadgodzinach bardzo źle wpływa na morale i efektywność zespołu – powinien jednoznacznie określać wygląd kodu, ale nie powinien być zbyt długi i szczegółowy (polecane są opracowania jednostronicowe) • Standard dokumentowania zakłada, że samych komentarzy w kodzie jest jak najmniej: – klasy powinny być tak zaprojektowane by przeznaczenie poszczególnych metod było jasne, a samo działanie oczywiste. – dokumentowanie całych klas (poleca się zwięzłe opisanie przeznaczenia klasy i jej działania) • XP stara się podtrzymać naturalne skłonności programistów do upiększania i ulepszania kodu Zaawansowana inżynieria oprogramowania 19 /26 Wspólna odpowiedzialność • Rzeczywiste tempo pracy powinno być stale weryfikowane (mierzone na podstawie efektów pracy), co pozwala na uwiarygodnienie szacunków kolejnych iteracji i zakończenia projektu Zaawansowana inżynieria oprogramowania 20 /26 Małe wydania i możliwie częsta integracja • Zbiorowa praca nad kodem, to jednak nie tylko wspólne pisanie go, ale i wspólna odpowiedzialność za niego=> kolektywne kontrolowanie kodu brak podziału kompetencji co do kontroli kodu • Dzięki standardom kodowania każdy programista jest zaznajomiony z całym systemem, nawet jeśli go nie pisał • W XP wszyscy są odpowiedzialni za dokonywanie poprawek kodu. Jeśli trzeba coś zmodyfikować nie ma problemu, bo poprawki może zrobić każdy. Częste przeorganizowywanie doprowadza kod do stanu dobrej przejrzystości, a gotowe procedury testujące zapewniają, ze poprawki nie doprowadza do katastrofy. • XP preferuje umieszczenie całej grupy programistów w jednym pomieszczeniu, co ma pomagać w komunikacji i rozwijaniu życia grupy. Zostawia jednak dla każdego jego prywatną przestrzeń. Do pracy w parach powinny być wyznaczone oddzielne komputery. Zaawansowana inżynieria oprogramowania – może przytrafić się czasem jeden tydzień nieco większego obciążenia, ale dwa tygodnie mogą już oznaczać kłopoty z harmonogramem prac – ważne jest to, by ustalić konkretną, nienaruszalną granicę obciążenia grupy 21 /26 Stałe testowanie • Małe kroki - osiąga się je poprzez podział zadania na małe historie użytkownika • Pojedynczy fragment kodu może być szybko przetestowany i złączony z reszta systemu; programista po wykonaniu każdego nowego fragmentu programu integruje go z systemem • Najczęściej stosuje się jedna maszynę, na której w danej chwili może pracować jedna osoba zajmującą się łączeniem kodu • Małe wydania to także akceptacje powstałego systemu przez klienta; dzięki ciągłym łączeniu zawsze istnieje sprawnie działająca wersja => informacja zwrotna, która ocenia czy zespół realizuje to, o co chodziło • Ciągłe łączenie jest ułatwione w XP dzięki prostym projektom, ciągłym testom i wspólnej odpowiedzialności za kod Zaawansowana inżynieria oprogramowania 22 /26 Model procesu • Ciągłe testowanie to podstawowe działanie podczas pisania programu • Programista jeszcze przed napisaniem danej procedury tworzy kod (test jednostkowy), który ma ją testować (test-first programming): – dzięki temu podczas pisania właściwego kodu procedury lepiej rozumie rozwiązywany problem i zabezpieczy ją przed tymi możliwościami • Pisanie procedury testowej nie powinno jednak trwać zbyt długo i nie powinna być ona zbyt rozbudowana. • Zespół dąży do automatyzowania procedur testowych, które są uruchamiane po każdorazowym łączeniu kodu oraz po refaktoringu – gwarantuje to, że zmiany w innych częściach oraz integracja programu nie spowodowały nowych problemów • Ponadto dla każdej historii, powstałej w grze planistycznej, klient określa test akceptacyjny. Kolejne wydanie nie jest zakończone dopóki test ten nie zostanie zdany pomyślnie. Zaawansowana inżynieria oprogramowania 23 /26 Zaawansowana inżynieria oprogramowania 24 /26 Typowy dzień • • Poranne spotkania - zespół zaczyna prace od krótkiego (np. 15 minut) spotkania na stojąco obok stanowisk (możliwość dostępu do kodu) – ma na celu zakomunikowanie problemów, które się ostatnio pojawiły i rozważenie możliwych rozwiązań Programowanie - po ustaleniu zadań zespół przystępuje do pracy – zarówno zakres prac jak i skład par jest dobierany autonomicznie przez programistów a nie narzucany – wszyscy programują w parach, tworzą testy wyprzedzające i refaktoryzują w celu uzyskania dopracowanego kodu • • Kiedy nie warto/można stosować XP? – programista może zwracać się do klienta o pomoc i dodatkowe wyjaśnienia – zaleca się kończenie realizacji zadań w ramach jednego dnia Integracja - po stworzeniu i przetestowaniu nowego elementu integruje się kod z właściwym systemem w repozytorium (na wydzielonym stanowisku) oraz uruchamia testy – jeżeli w wyniku błędów nie uda się zintegrować powstałego kodu do końca dnia zaleca się porzucenie stworzonego kodu i rozpoczęcie od nowa w kolejnym dniu Koniec dnia - po przepracowaniu ustalonego czasu, uśmiechnięty zespół idzie do domu Zaawansowana inżynieria oprogramowania 25 /26 Przygotowano na podstawie: ● Extreme Programming: A gentle introduction Don Wells, [www.eXtremeProgramming.org], 2009. ● G. Młynarczyk, J. Kołodziej – Inżynieria oprogramowania, wykład 11, WSZiB w Krakowie ● Extreme Programming - Zapewnienie skutecznej i wydajnej pracy programistów, Krzysztof Kaczmarski, 2002 • Jeżeli wykorzystywany proces umożliwia produkcję oprogramowania w sposób satysfakcjonujący klientów i członków grupy projektowej • W dużych projektach lub wymagających dużego stopnia formalności – niezbędny duży zespół - więcej niż kilkanaście osób i czas rzędu kilkunastu miesięcy; rozbudowana dokumentacja • Brak dostępu do klienta - możliwość uzyskania szybko informacji zwrotnej na temat dostarczanych rozwiązań jest bardzo ograniczona – zespół projektowy i/lub klient pracuje w różnych, odległych lokalizacjach • Zarządzanie częstymi zmianami nie jest możliwe a ich koszty są bardzo wysokie (np. ze względu na wykorzystane technologie) • W innych przypadkach warto rozważyć zastosowanie XP, zwłaszcza gdy: – wymagania nie są ustabilizowane i mogą podlegać częstym zmianom – istnieje grupa projektowa składa się z deweloperów o wysokich umiejętnościach – wymagana jest wysoka efektywność pracy zespołu projektowego Zaawansowana inżynieria oprogramowania 26 /26