Inżynieria Oprogramowania 1. Wstęp 26/03/2017 Inżynieria Oprogramowania 1. Wstęp Leszek J Chmielewski Wydział Zastosowań Informatyki i Matematyki SGGW www.lchmiel.pl
Plan Inżynieria oprogramowania znaczenie elementy Podstawowe pytania dotyczące inżynierii oprogramowania
Dlaczego? Kryzys oprogramowania Wiek XX: wzrost złożoności oprogramowania Syndrom LOOP: Late Over budget Overtime Poor quality Programiści proponują więcej Klienci też chcą więcej, ale nie tego samego, co jest im oferowane
Kryzys oprogramowania Nie widać jednoznacznego polepszenia
Inżynieria oprogramowania Zastosowanie zdyscyplinowanego systematycznego ilościowego podejścia do rozwoju eksploatacji i utrzymania oprogramowania
Źródła Materiały dra Waldemara Karwowskiego, wykładowcy w poprzednich semestrach Materiały z „ważniaka”: http://wazniak.mimuw.edu.pl Ian Sommerville, Inżynieria Oprogramowania, WNT, Warszawa 2003 Ian Sommerville, Software Engineering, Pearson Education Limited, 2001 Włodzimierz Dąbrowski, Kazimierz Subieta, Podstawy inżynierii oprogramowania, Wydawnictwo PJWSTK, Warszawa 2005. Inne materiały, osobno cytowane
Inżynieria oprogramowania 26/03/2017 Inżynieria oprogramowania Gospodarki wszystkich rozwiniętych krajów zależą od oprogramowania Coraz więcej systemów wymaga niezawodnego oprogramowania Inżynieria oprogramowania: teoria, metody i narzędzia związane z wytwarzaniem oprogramowania Jak każda inżynieria
Koszty oprogramowania 26/03/2017 Koszty oprogramowania Koszty oprogramowania są często dominującym składnikiem kosztów całego systemu Zdarza się, że koszt oprogramowania znacznie przekracza samą wartość sprzętu komputerowego, np. komputera osobistego Koszt utrzymania i konserwacji oprogramowania jest większy niż koszt jego wytworzenia Wieloletnia konserwacja oprogramowania może kosztować wielokrotnie więcej niż jego zakup Stąd potrzeba efektywnych metod i dobrych praktyk
Kryzys oprogramowania Uzależnienie organizacji od systemów komputerowych i przyjętych technologii nie są one stabilne w długim horyzoncie czasowym Problemy współdziałania niezależnie zbudowanego oprogramowania szczególnie istotne przy dzisiejszych tendencjach integracyjnych Problemy przystosowania istniejących systemów do nowych wymagań, tendencji i platform sprzętowo-programowych Frustracje informatyków wynikające ze zbyt szybkiego postępu w zakresie narzędzi i metod wytwarzania uciążliwości i długotrwałości procesów produkcji i pielęgnacji oprogramowania znaczące zmiany w przemyśle informatycznym następują co 5-7 miesięcy w porównaniu do 5-7 lat w innych dziedzinach
Kryzys oprogramowania - przyczyny Konflikt pomiędzy odpowiedzialnością, jaka spoczywa na współczesnych SI, a ich zawodnością wynikającą ze złożoności i ciągle niedojrzałych metod tworzenia i weryfikacji oprogramowania Długi i kosztowny cykl tworzenia oprogramowania, wysokie prawdopodobieństwo niepowodzenia Niska kultura ponownego użycia wytworzonych komponentów projektów i oprogramowania (reuse) Niski stopień powtarzalności przedsięwzięć Długi i kosztowny cykl życia SI, wymagający stałych (często globalnych) zmian Eklektyczne, niesystematyczne narzędzia i języki programowania
Źródła złożoności oprogramowania Podstawowym powodem kryzysu oprogramowania jest złożoność produktów informatyki i procesów ich wytwarzania Dziedzina problemowa, obejmująca ogromną liczbę wzajemnie uzależnionych aspektów i problemów Zespół projektantów podlegający ograniczeniom pamięci, percepcji, wyrażania informacji i komunikacji Oprogramowanie Potencjalni użytkownicy: czynniki psychologiczne, ergonomia, ograniczenia pamięci i percepcji, skłonność do błędów i nadużyć, tajność, prywatność Środki i technologie informatyczne: sprzęt, oprogramowanie, sieć, języki, narzędzia, itd.
Pytania o inżynierii oprogramowania Co to jest oprogramowanie? Co to jest inżynieria oprogramowania? Jaka jest różnica pomiędzy inżynierią oprogramowania a informatyką? Jaka jest różnica pomiędzy inżynierią oprogramowania a inżynierią systemów? Co to jest proces tworzenia oprogramowania? Co to jest model procesu tworzenia oprogramowania? Jakie są koszty inżynierii oprogramowania? Jakie właściwości ma dobre oprogramowanie? Jakie są najistotniejsze wyzwania dla inżynierów oprogramowania? Co to jest CASE (Computer-Aided Software Engineering)?
Co to jest oprogramowanie? Są to programy komputerowe, cała związana z nimi dokumentacja i dane konfiguracyjne Rodzaje produktów oprogramowania Powszechne Dostosowane (na zamówienie)
Co to jest inżynieria oprogramowania? Jest to dziedzina inżynierii, która obejmuje wszystkie aspekty tworzenia oprogramowania od fazy początkowej do jego pielęgnacji Inżynierowie oprogramowania pracują w sposób systematyczny i uporządkowany ponieważ jest to najskuteczniejszy sposób tworzenia oprogramowania wysokiej jakości
Jaka jest różnica pomiędzy inżynierią oprogramowania a informatyką? Zasadniczo informatyka obejmuje teorie i podstawowe zasady działania komputerów Inżynieria oprogramowania obejmuje praktyczne problemy związane z tworzeniem oprogramowania Byłoby dobrze, gdyby inżynier programowania znał teorie informatyczne, choć nie zawsze przystają one do rzeczywistości
Jaka jest różnica pomiędzy inżynierią oprogramowania a inżynierią systemów? Inżynieria systemów komputerowych obejmuje wszystkie aspekty tworzenia i ewolucji systemów komputerowych, w których oprogramowanie odgrywa zasadniczą rolę Inżynierowie systemów biorą udział w specyfikacji systemu i definiowania jego ogólnej architektury
Co to jest proces tworzenia oprogramowania? Jest to zbiór czynności i związanych z nimi wyników, które zmierzają do opracowania produktu programowego Przykładowe czynności wspólne dla wszystkich procesów Specyfikacja Projektowanie Budowa Integracja i testowanie
Co to jest model procesu tworzenia oprogramowania? Jest to uproszczona prezentacja procesu tworzenia oprogramowania (model == uproszczenie) Przykłady modeli oprogramowania: Model przepływu prac Model przepływu danych Model rola-akcja Przykłady ogólnych modeli (paradygmatów) tworzenia oprogramowania Model kaskadowy Tworzenie ewolucyjne Formalne przekształcenia Składanie systemu z komponentów ponownego użycia
Cykl życiowy oprogramowania Fazy cyklu życiowego oprogramowania: Faza specyfikacji i analizy wymagań modelowanie pojęciowe Faza projektowania projektowanie logiczne Faza konstrukcji (implementacji) projektowanie fizyczne Faza testowania Faza wdrożenia czas
Modele tworzenia oprogramowania Model kaskadowy najprostszy Model ewolucyjny badawczy dla niezdecydowanego klienta Model spiralny jw., lepiej uwzględnia ryzyko Model przyrostowy lepszy niż kaskadowy, tańszy niż ewolucyjny Model formalny gdy można wszystko formalnie zapisać systemy krytyczne Model z wielokrotnym użyciem komponentów
Model kaskadowy
Model kaskadowy Najpopularniejsze podejście Kolejne etapy następują po sobie: sformułowanie wymagań, zatwierdzenie analiza projektowanie implementacja W czystym modelu kaskadowym każdy etap rozpoczyna się po zakończeniu poprzedniego Wada: brak procesu weryfikacji pomiędzy etapami Zastosowanie w czystej postaci: do projektów krótkich, gdzie wymagania są bardzo dobrze określone, a wątpliwości można wyjaśnić na czas
Model przyrostowy
Model przyrostowy Najpierw określamy wymagania, dokonujemy analizy i określamy ogólną architekturę systemu, zatwierdzenie Następne kroki znane z modelu kaskadowego wykonujemy etapami Pozwala projektować system etapami w przypadku, gdy nie możemy zaprojektować od razu całego systemu nie wiadomo, które funkcje okażą się bardziej istotne zakres przyrostów można zatwierdzić, liczbę niekoniecznie Można lepiej wykorzystać zasoby finansowe oraz zespoły ludzkie Istotna jest faza początkowa, w której należy wyznaczyć zakres całego projektu oraz określić etapy jego realizacji Dla całości systemu, jednokrotnie: kompleksowa analiza architektura projektu Etapowo, przyrostowo jest wykonywana realizacja zgodnie z potrzebami i możliwościami klienta
Model ewolucyjny
Model ewolucyjny Wersja początkowa Specyfikacja Ogólny opis Tworzenie Wersje pośrednie Zatwierdzanie Wersja końcowa Inny rysunek (I. Sommerville): Tworzenie badawcze: celem jest praca z klientem – badanie wymagań i dostarczenie systemu Prototypowanie z porzuceniem: celem jest zrozumienie wymagań klienta – wypracowanie lepszej definicji wymagań
Model ewolucyjny Wdrażamy kolejno coraz bardziej rozbudowane systemy informatyczne Projektowanie nadążne, tzn. że cały czas jesteśmy nastawieni na zmieniający się cel ponieważ wraz z upływem czasu cel ulega zmianie, musimy przez cały czas analizować i kontrolować proces projektowania w ten sposób staramy się zminimalizować straty, spowodowane wadliwym działaniem systemu Kosztem etapowej modyfikacji systemu, uzyskujemy efekt jego aktualności Ważne: mieć końcową wizję projektu i konsekwentnie realizować podzielone na kroki działania wdrożeniowe Problemy: wzrost trudności zarządzania – nie widać procesu nabranie nadmiernego tempa zmian i pojawianie się nowych celów ponad możliwości akceptacji system ma złą strukturę – źle dla dużych systemów specjalne narzędzia do programowania, rzadkie
Model spiralny
Model spiralny Cechą charakterystyczną jest realizacja kolejno poszczególnych zakresów działania systemów System dzieli się na etapy i dla każdego z nich opracowuje się całościowy projekt Zasadą jest, że stawiamy sobie cel i ulepszamy system metodą kolejnych przybliżeń Czas realizacji jest stosunkowo długi, o wiele dłuższy niż w poprzednio opisanych procedurach Stosuje się: dla złożonych i stosunkowo drogich przedsięwzięć, gdzie czas i koszty nie odgrywają istotnej roli, a najważniejsza jest jakość systemu informacyjnego dla projektów, dla których przewidujemy dość długi okres eksploatacji
Model spiralny Ciąg czynności jest następujący, kolejno: planowanie analiza ryzyka konstruowanie weryfikacja Etap konstruowania obejmuje: prototyp, symulację, kodowanie, integrację, testowanie modułów, testowanie całości, wdrożenie Sekwencja ta jest wielokrotnie powtarzana W wyniku realizacji poszczególnych etapów otrzymujemy projekt coraz bardziej doskonały – oczywiście większym kosztem.
Jakie są koszty inżynierii oprogramowania? Koszty wytworzenia oprogramowania można w przybliżeniu określić na 60%, natomiast 40% stanowią koszty testowania Ewolucja oprogramowania może przewyższyć koszty jego wytworzenia Koszty zmian oprogramowania użytkowanego przez długi okres czasu mogą kilkukrotnie przekroczyć koszty jego wytworzenia Koszty zależą od stosowanego modelu
Jakie właściwości ma dobre oprogramowanie? Konkretny zbiór właściwości zależy od zastosowania, niemniej można podać ogólny zbiór właściwości Zdatność do pielęgnacji zdolność do ewolucji zgodnie z potrzebami klientów Niezawodność nie powinno powodować fizycznych lub ekonomicznych katastrof w przypadku awarii Efektywność nie powinno marnotrawić zasobów systemu takich jak pamięć czy czas procesora Użyteczność powinno być użyteczne, bez zbędnego wysiłku ze strony użytkownika (np. interfejsy)
Jakie są najistotniejsze wyzwania dla inżynierów oprogramowania? Wyzwanie dziedzictwa Pielęgnacja i modyfikacji działających dużych systemów, pełniących poważne funkcje gospodarcze Wyzwanie różnorodności Wymóg działania oprogramowania w systemach rozproszonych przy rożnych typach komputerów i systemów wspomagających Wyzwanie doręczenia Wymóg dostarczanie gotowego programowania w skróconym czasie bez utraty jakości
Zadania inżynierii oprogramowania Zadania stojące przed inżynierią oprogramowania w walce z narastającą złożonością oprogramowania: Redukcja tej złożoności Propagowanie wykorzystywania technik i narzędzi ułatwiających pracę nad złożonymi systemami Upowszechnianie metod wspomagających analizę nieznanych problemów oraz ułatwiających wykorzystanie wcześniejszych doświadczeń Usystematyzowanie procesu wytwarzania oprogramowania, tak aby ułatwić jego planowanie i monitorowanie Wytworzenie wśród producentów i nabywców przekonania, że budowa dużego systemu wysokiej jakości jest zadaniem wymagającym profesjonalnego podejścia
Co to są metody inżynierii oprogramowania? Uporządkowane podejście do tworzenia oprogramowania, które obejmuje: Opisy modeli systemu np. Modele obiektów, modele przepływu itp. Reguły ograniczenia, którym podlegają modele systemu Zalecenia heurystyki, które określają dobre zwyczaje projektantów Poradnictwo opisy czynności, które należy wykonać
Modelowanie pojęciowe Modelowanie pojęciowe (conceptual modeling) oraz model pojęciowy (conceptual model) odnoszą się do procesów myślowych, do wyobrażeń towarzyszących pracy nad oprogramowaniem Projektant, programista, itp. muszą dokładnie wyobrazić sobie problem oraz metodę jego rozwiązania. Zasadnicze procesy tworzenia oprogramowania zachodzą więc w ludzkim umyśle i nie są związane z jakimkolwiek językiem programowania czy jakimkolwiek narzędziem w ogóle Modelowanie pojęciowe może (i powinno) być wspomagane przez środki wzmacniające ludzką pamięć i wyobraźnię, służące do opisu odwzorowywanej rzeczywistości w postaci struktur danych, operacji na danych, zachodzących procesów.
Metodyka Metodyka, w inżynierii oprogramowania, jest zestawem pojęć, oznaczeń, języków, modeli, diagramów, technik i sposobów postępowania służących do modelowania dziedziny problemowej stanowiącej przedmiot projektowanego systemu Metodyka jest wykorzystywana zarówno do projektowania pojęciowego, jak i logicznego czy fizycznego Metodyka ustala fazy realizacji projektu, a ponadto dla każdej z faz projektu wyznacza: role uczestników projektu, scenariusze postępowania, reguły przechodzenia do następnej fazy, modele, które powinny być wytworzone, dokumentację, która powinna powstać, notację, której należy używać
Co to jest CASE (Computer-Aided Software Engineering) CASE obejmuje rożne programy wykorzystane do wspomagania czynności procesu tworzenia oprogramowania (np. edytory notacji, generatory kodów) Upper-CASE Związane z początkowymi fazami tworzenia oprogramowania Lower-CASE Wspomagają implementowanie i testowanie
Metody i techniki analizy i projektowania W ramach metodyk wykorzystywane są metody analizy i projektowania oprogramowania Metoda projektowania oprogramowania jest to taki sposób postępowania, który ma na celu otrzymanie projektu systemu Technika jest pojęciem węższym. Technika projektowania jest to szczególny sposób postępowania, który służy konkretnemu rozwiązaniu w projektowaniu systemu informacyjnego Określona technika może służyć jednej lub wielu metodom projektowania Metody i techniki projektowania systemów informacyjnych, podobnie jak metody i techniki analizy podzielić można na grupy: Strukturalne Obiektowe
Podejście strukturalne Opiera się na rozkładzie problemu na części składowe. System ulega hierarchicznej dekompozycji Konsekwentna hierarchiczna struktura projektu (projektowanie od góry do dołu, czyli od ogółu do szczegółu) Podział projektu na moduły (niekiedy jako studium pośrednie występują jednostki funkcjonalne, podsystemy), z których jest jedno wejście i jedno wyjście Zaletą projektowania strukturalnego jest to, że przedsięwzięcie projektowe możemy podzielić na mniejsze części. możliwa jest równoległa, grupowa praca, a więc rozdział zadań pomiędzy mniejsze zespoły Prowadzi to do skrócenia czasu opracowania projektu. Trudności pojawiają się przy powiązaniu i zestrojeniu ze sobą opracowanych oddzielnie modułów
Podejście obiektowe Polega na stopniowym rozszerzaniu modelu opracowanego dla potrzeb analizy o moduły takie, jak: kontakt z użytkownikiem, zarządzanie zadaniami, zarządzanie danymi W czasie projektowania model jest na ogół kontynuacją analizy obiektowej wtedy analiza i projektowanie mogą się wzajemnie przeplatać Wyróżnikiem analizy i projektowania jest to, że analiza obiektowa służy do identyfikowania i definiowania tych klas i obiektów, które w bezpośredni sposób odzwierciedlają zadania systemu, natomiast czynności projektowe przedstawiają realizację wymagań.
26/03/2017 Podsumowanie Inżynieria oprogramowania to dziedzina inżynierii, która obejmuje wszystkie aspekty tworzenia oprogramowania Produkty programowe składają się z utworzonych programów oraz związanej z nimi dokumentacji Zasadniczymi atrybutami produktów są zdatność do pielęgnacji, niezawodność, efektywność i użyteczność Głównymi czynnościami podczas produkcji oprogramowania są specyfikacja oprogramowania, tworzenie, zatwierdzenie i ewolucja
26/03/2017 Podsumowanie cd. Modele tworzenia oprogramowania to uporządkowane sposoby jego budowy Obejmują sugestie wyboru procesu tworzenia, mutacji, reguły określające, jakie opisy systemu opracować, a także wskazówki projektowe Narzędzia CASE to systemy komputerowe, które są przeznaczone do wspomagania rutynowych czynności procesu tworzenia, takich jak praca nad diagramami projektowymi, sprawdzanie poprawności diagramów oraz śledzenie wykonanych testów UML to najważniejsza obiektowa notacja do specyfikacji, konstruowania, wizualizacji i dokumentowania systemów
Dziękuję leszek_chmielewski@sggw.pl http://www.lchmiel.pl