Podręcznik

1. Wprowadzenie do inżynierii wymagań

1.1. Rola wymagań w inżynierii oprogramowania

Podstawowym pojęciem inżynierii wymagań jest oczywiście „wymaganie”. Wymaganie to jako własność produktu końcowego (systemu oprogramowania), którą musi on posiadać, aby spełnić oczekiwania zamawiającego. Mówi się, że system spełnia wymagania, jeśli zostało potwierdzone, że posiada wszystkie własności określone tymi wymaganiami.

Na tej podstawie możemy również określić, czym jest inżynieria wymagań. Jest to dyscyplina inżynierii oprogramowania, która obejmuje działania polegające na zbieraniu, analizowaniu, negocjowaniu i specyfikowaniu (zapisywaniu) wymagań. Głównym produktem tej dyscypliny jest specyfikacja wymagań, która jest podstawą efektywnego kosztowo wytworzenia systemu oprogramowania zgodnego z oczekiwaniami zamawiającego.

Można powiedzieć, że jakość wymagań jest kluczowym elementem powodzenie każdego projektu konstrukcji systemu oprogramowania. Źle sformułowane wymagania są bardzo częstą przyczyną niepowodzeń. Z drugiej strony, można powiedzieć, że dobre sformułowanie wymagań polega na dobrym odzwierciedleniu rzeczywistych potrzeb zamawiającego. W szczególności, dobrej jakości wymagania powinny charakteryzować się kilkoma podstawowymi cechami.

Wymagania powinny być kompletne. Oznacza to, że powinny one obejmować cały zakres potrzeb zamawiającego, opisany w niezbędnych szczegółach.

Drugą istotną cechą wymagań jest ich jednoznaczność i poprawność. Takie wymagania powinny definiować jeden możliwy zakres systemu, i nie pozostawiać pola do różnych interpretacji. Aby zapewnić jednoznaczność i poprawność, należy stale upewniać się, że wymagania są przejrzyste dla zamawiającego, ale również – że są zrozumiałe dla deweloperów.

Wymagania powinny być również spójne, czyli niesprzeczne. Eliminacja sprzeczności polega na ciągłym wzajemnym porównywaniu wymagań ze sobą, szczególnie wymagań różnych rodzajów. Sprzeczności często prowadzą do problemów podczas realizacji systemu.

Kolejna cecha dobrej specyfikacji wymagań to możliwość zarządzania. Wymagania powinny być podzielone na dobrze określone jednostki, które mogą sterować procesem wytwórczym. Powinny one być na tyle małe, aby można było je przydzielać do wykonania w stosunkowo krótkich odcinkach czasu (np. w ciągu jednej iteracji/sprincie). Jednocześnie, poszczególne wymagania powinny mieć przypisane  odpowiednie atrybuty pozwalające na efektywne przydzielanie ich do wykonania w trakcie projektu.

Bardzo istotną, można powiedzieć – kluczową cechą wymagań jest ich testowalność (mierzalność). Wymaganie, którego nie jesteśmy w stanie przetestować jest nic niewarte. Stosunkowo prosto jest sformułować testy dla wymagań funkcjonalnych. Sprawa jest trudniejsza w przypadku wymagań jakościowych. Konieczne jest opracowanie odpowiednich metryk, które pozwolą na jednoznaczne potwierdzenia spełnienia takich wymagań.

Ważne jest, aby źródłem wymagań były osoby (zamawiający, użytkownicy) dobrze umocowane i reprezentatywne. W szczególności mogą to być kluczowi użytkownicy (np. kierownicy zespołów, doświadczeni konsultanci wewnętrzni, mentorzy) oraz kluczowi sponsorzy projektu (kierownicy wysokiego szczebla, którym zależy na powodzeniu projektu).

Bardzo istotnym składnikiem inżynierii wymagań jest zarządzanie wymaganiami. Polega na ciągłym upewnianiu się, że rozwiązujemy właściwy problem i budujemy właściwy system. Dzieje się to poprzez systematyczne podejście do: 1) zbierania, 2) organizowania, 3) dokumentowania, 4) wykorzystywania, zmieniających się wymagań na system oprogramowania. Zarządzamy wymaganiami ponieważ nie są one oczywiste i pochodzą z wielu źródeł. Poza tym, zarządzanie dotyczy różnych rodzajów wymagań oraz różnych poziomów ich szczegółowości. W typowym systemie oprogramowania możemy wyróżniać setki lub nawet tysiące wymagań, które musimy w odpowiedni sposób uporządkować. Należy również zawsze pamiętać, że wymagania podlegają ciągłym zmianom, wynikającym np. ze zmian otoczenia biznesowego lub warunków w ramach organizacji zamawiającej oprogramowanie.

Kluczowe w zarządzaniu wymaganiami jest umiejętne podzielenie całego zbioru wymagań klienta na odpowiednie jednostki, czyli pojedyncze wymagania. Każde wymaganie to jedna charakterystyka systemu, który mamy zbudować. Aby móc efektywnie zarządzać wymaganiami musimy je móc w jednoznaczny sposób identyfikować. Wymaganie powinno mieć nazwę (jedno krótkie zdanie) oraz treść (reprezentację, w postaci kilku akapitów tekstu, czy niedużego modelu graficznego). Wymagania powinny także mieć odpowiedni zbiór atrybutów, które ułatwiają zarządzanie nimi. Bardzo pomocne jest, na przykład, nadanie wymaganiom numerów identyfikacyjnych, priorytetów, czy określenie osób za nie odpowiedzialnych.

Zarządzanie wymaganiami to również zarządzanie zmianami wymagań. Jest to nieodłączny element każdego projektu. Zmiany wymagań wynikają ze zmieniających się warunków prawnych, biznesowych czy organizacyjnych. Zmiany mogą też wynikać z niezdecydowania klienta lub niezrozumienia jego potrzeb. Mogą też wynikać z polityki wewnątrz organizacji zamawiającej oprogramowanie. Niezależnie od przyczyn, należy podkreślić, że praktycznie nie istnieją nietrywialnie projekty, podczas których nie dochodzi do zmiany wymagań. Niestety, czasami nawet najmniejsza zmiana sformułowania wymagania może rodzić bardzo poważne konsekwencje dla realizowanego systemu. Dlatego też, każda zmiana wymagań powinna być traktowana z bardzo dużą uwagą.

1.2. Specyfikowanie środowiska systemu

W dzisiejszych czasach elementem niemal każdej organizacji biznesowej jest jakiś system oprogramowania. Systemy oprogramowania wspierają co najmniej część działalności przedsiębiorstw, a w wielu przypadkach są fundamentem tej działalności, jak np. w przypadku handlu elektronicznego. Różnego rodzaju organizacje i przedsiębiorstwa funkcjonujące w określonych środowiskach biznesowych również stanowią fragmenty otaczającego nas świata. Aby zrozumieć daną organizację biznesową powinniśmy stworzyć jej model.

Dokonując analizy przedsiębiorstwa, pierwszym pytaniem, na które powinniśmy odpowiedzieć jest: gdzie przebiega granica naszego biznesu? Definicję zakresu biznesu zaczynamy od definicji jego otoczenia. Otoczenie biznesu definiujemy jako zbiór wszystkich jednostek współpracujących z biznesem. Tymi jednostkami współpracującymi mogą być klienci, podwykonawcy, dostawcy podzespołów, spedytorzy, zleceniodawcy, instytucje państwa, agenci, itd. Biznes może również współpracować bezpośrednio z zewnętrznymi systemami informatycznymi.

Aby opisać współpracę powinniśmy przede wszystkim zidentyfikować i opisać przebieg procesów biznesowych. Żeby zrozumieć pojęcie procesu biznesowego należy zrozumieć samo pojęcie procesu. Ogólna definicja określa proces jako serię wzajemnie powiązanych zadań, które przekształcają dane wejście w wyjście. Należy zwrócić uwagę na dwa aspekty wynikające z tej definicji. Pierwszy aspekt związany jest z samym wyróżnianiem danego procesu oraz jego potencjalnymi interakcjami z innymi procesami. Z tego punktu widzenia proces posiada wejście, wyjście oraz określone granice wyznaczające co konkretnie on obejmuje. Drugi aspekt dotyczy wewnętrznej struktury procesu. W celu jej pokazania trzeba dokładnie określić w jaki sposób tworzące go zadania są ze sobą powiązane i w jaki sposób prowadzi to do uzyskania oczekiwanego wyjścia na podstawie wejścia. Typowo, poszczególne zadania przedstawiane są w postaci sekwencji uporządkowanej w czasie. Proces biznesowy jest szczególnym rodzajem procesu, który wytwarza wartość dla jego odbiorcy. Innymi słowy wartość wyjścia z procesu jest większa niż jego wejścia z punktu widzenia danego biznesu. Podsumowując, można powiedzieć, że proces biznesowy:

  • posiada jasno określone granice, wejście i wyjście,
  • składa się z sekwencji uporządkowanych na przestrzeni czasu czynności,
  • tworzy wartość dodaną dla określonego odbiorcy (beneficjenta procesu).

Istnieje wiele sposobów modelowania procesów biznesowych, w tym dedykowane do tego notacje, jak BPMN (Business Process Modeling Notation). Model czynności zawarty w języku UML posiada elementy, które są w znacznym stopniu analogiczne do elementów języka BPMN. Zaletą takiego rozwiązania jest możliwość łatwej synchronizacji modeli procesów biznesowych z innymi modelami. Na przykład, w celu określenia zakresu modelowanych procesów biznesowych możemy wykorzystać diagramy przypadków użycia. Przykładowy taki diagram widzimy na rysunku 1.1.

Rysunek 1.1: Procesy biznesowe modelowanie jako przypadki użycia biznesu

Przypadek użycia biznesu możemy opisać wykorzystując diagram czynności. Przykładowy diagram modelujący proces biznesowy „Zakup części zamiennych on-line” przedstawiony jest na rysunku 1.2.

 

Rysunek 1.2: Diagram czynności opisujący proces biznesowy

1.3. Struktura specyfikacji wymagań – rodzaje wymagań

Dobre praktyki inżynierii wymagań wskazują na potrzebę jednoznacznego podziału specyfikacji zarówno pod kątem poziomu abstrakcji (szczegółowości) wymagań jak i ich rodzaju. Dobrze zbudowana specyfikacja wymagań powinna mieć strukturę piramidy, przedstawionej na rysunku 1.3. Szczyt takiej piramidy stanowi ogólny opis systemu – jego wizja. Elementy wizji systemu stanowią punkt wyjścia do sformułowania wymagań użytkownika określających zakres budowanego systemu. Podstawą piramidy i jednocześnie jej największym fragmentem są wymagania oprogramowania, wyrażające wszystkie szczegółowe potrzeby zamawiającego. Na wszystkich poziomach piramidy formułujemy wymagania czterech rodzajów: wymagania funkcjonalne, jakościowe, słownikowe, oraz ograniczenia środowiskowe i techniczne.

Rysunek 1.3: Organizacja specyfikacji wymagań

Należy tutaj podkreślić, że specyfikacja wymagań nie musi (a często – nie powinna) być tworzona jako jeden gruby dokument na początku całego procesu wytwarzania oprogramowania. W metodykach iteracyjnych (zarówno zwinnych jak i sformalizowanych), wymagania są zbierane i formułowane przez cały okres projektu. W wielu projektach konieczne jest jednak sformułowanie formalnej umowy między zamawiającym a wykonawcą systemu. Kluczowym elementem takiej umowy jest specyfikacja wymagań zamawiającego. Z punktu widzenia struktury wymagań, taka specyfikacja powinna objąć dwie górne warstwy piramidy. W ramach wymagań zamawiającego, zamawiający przedstawia swoje rzeczywiste potrzeby związane z wspieraną przez system dziedziną swojej działalności. Jednocześnie, określa zakres systemu na tyle jednoznacznie, żeby możliwe było dokonanie wyceny budowanego systemu przez wykonawcę.

Wizja systemu ma charakter bardzo ogólny i nie powinna mieć charakteru wiążącego w kontaktach między zamawiającym a wykonawcą systemu. Celem jej jest sformułowanie intencji przyświecających rozwojowi systemu i wyszczególnienie problemów odkrytych w modelu biznesu zamawiającego. Kompletna wizja systemu powinna zawierać:

  • opis problemu biznesowego, który jest podstawą dla powstania nowego systemu
  • przedstawienie interesariuszy powstającego systemu, czyli osób bezpośrednio i pośrednio zainteresowanych powstaniem systemu
  • ogólne cechy i funkcje systemu oraz słownik pojęć biznesowych,
  • najważniejsze ograniczenia środowiskowe i techniczne przyszłego systemu,
  • opcjonalnie - motto projektu, czyli krótki „slogan” oddający główny cel powstania produktu informatycznego.

Wymagania użytkownika definiują system w sposób na tyle szczegółowy, aby potencjalnie stanowić mniej lub bardziej formalną podstawę do kontroli postępów prac, w tym – zawarcia kontraktu na wykonanie systemu. Typowo, na wymagania użytkownika składają się wymagania funkcjonalne wyrażone przez uporządkowaną strukturę jednostek funkcjonalnych (np. przypadków użycia), definicje użytkowników i systemów zewnętrznych, słownik pojęć dziedziny wykorzystywanych podczas formułowania wymagań, istotne wymagania jakościowe oraz ograniczenia środowiskowe przyszłego systemu.

W trakcie prac na systemem, wymagania oprogramowania podlegają dokładnej specyfikacji – uszczegółowieniu. Odpowiada za to najbardziej szczegółowy poziom piramidy wymagań, czyli wymagania oprogramowania. Precyzja określenia wymagań oprogramowania powinna zapewniać jednoznaczność implementacji systemu przez zespół deweloperski. Na ich podstawie, zespół powinien móc zaprojektować i zakodować wszystkie komponenty systemu. Oznacza to, że w ramach specyfikowania wymagań oprogramowania konieczne jest szczegółowe ustalenie z zamawiającym scenariuszy zachowania systemu, wyglądu interfejsu użytkownika oraz struktury przetwarzanych przez system danych wraz z opisem algorytmów przetwarzania danych.

Na wszystkich poziomach piramidy wymagań powinien być wyraźnie zachowany podział między różnymi rodzajami wymagań. Rodzaje wymagań stanowią „kolumny” piramidy, gdyż na kolejnych poziomach stanowią jednolitą całość, opisywaną w sposób coraz bardziej szczegółowy.

Wymagania funkcjonalne określają sposób zachowania się systemu w interakcji z jednostkami na zewnątrz tego systemu – użytkownikami (ludźmi) oraz systemami zewnętrznymi. W ramach specyfikacji wymagań funkcjonalnych powinniśmy odpowiedzieć na podstawowe pytanie: „co system ma robić?” W szczególności, specyfikacja powinna określać m.in. usługi dostarczane przez system, sposób reakcji na komunikaty dochodzące spoza systemu, sposób zachowania w określonych sytuacjach i przy aktualnym stanie systemu. Zestaw wymagań funkcjonalnych określa zakres funkcjonalności konieczny do zrealizowania przez zespół budujący system oprogramowania.

Wymagania jakościowe inaczej nazywamy wymaganiami pozafunkcjonalnymi. Stanowią one charakterystyki systemu określające sposób oceny działania systemu. O ile wymagania funkcjonalne definiują to, „co system powinien robić”, o tyle  wymagania jakościowe definiują to, „jak system powinien coś robić”. System może realizować wszystkie wymagania funkcjonalne, lecz nadal nie spełniać oczekiwań zamawiającego. Może np. działać zbyt wolno, być zawodny lub nie spełniać kryteriów bezpieczeństwa.

Ograniczenia środowiskowe i techniczne określają warunki narzucone budowanemu systemowi przez jego otoczenie oraz konieczne do zastosowania technologie. Ograniczenia nie są zatem wymaganiami w sensie potrzeb zamawiającego. Stanowią one wymagania w sensie narzuconych przez zamawiającego warunków, w jakich będzie tworzony i uruchamiany system. Te warunki mogą dotyczyć środowiska, w jakim będzie pracował system (np. wyposażenie stanowisk pracy, warunki pogodowe), technologii wymaganych podczas budowy sytemu (np. posiadane licencje na system bazy danych)  lub jego działania (np. posiadany przez zamawiającego sprzęt).

Wymagania słownikowe definiują zakres pojęć i danych, które są używane w ramach dziedziny problemu obejmującej budowany system. Słownik powinien zawierać na bieżąco aktualizowane definicje wszystkich pojęć używanych w ramach wymagań funkcjonalnych, jakościowych oraz ograniczeń. Definicje te wykonywane są na różnym poziomie szczegółowości. Na poziomie wizji, często wystarczy krótkie 1-2 zdaniowe wyjaśnienie znaczenia danego pojęcia. Na poziomie wymagań użytkownika konieczne jest określenie co najmniej najważniejszych atrybutów pojęć oraz wyspecyfikowanie relacji między pojęciami. Wymagania oprogramowania wprowadzają konieczność zdefiniowania wszystkich szczegółów dotyczących struktur danych, czyli stworzenie szczegółowego modelu danych.

Zbiór wszystkich wymagań stanowi specyfikację wymagań, która może być wyrażona w sposób mniej lub bardziej sformalizowany. Często wymagane jest stworzenie formalnego dokumentu, który będzie stanowił załącznik do umowy miedzy zamawiającym z wykonawcą. Przykładową strukturę takiego dokumentu specyfikacji wymagań zamawiającego przedstawia rysunek 1.4. Struktura ta jest zgodna ze strukturą dwóch górnych warstw piramidy.

Rysunek 1.4: Przykładowa struktura dokumentu specyfikacji wymagań zamawiającego

Warunki projektu mogą również narzucać tworzenie dokumentów wymagań już po zawarciu kontraktu. Struktura takich dokumentów może być rozwinięciem struktury specyfikacji wymagań zamawiającego, przedstawionej na rysunku 1.4. Jak wiemy, wymagania zamawiającego są uszczegóławiane w ramach specyfikowania wymagań oprogramowania. Dlatego też, dokument specyfikacji wymagań oprogramowania może zawierać uszczegółowienie elementów opisujących zakres systemu.