Bardzo często spotykam się z projektami, w których użytkownicy narzekają na dostawcę oprogramowania, uważają że program nie całkiem spełnia ich oczekiwania (wymagania podpisali… ale to nie rozwiązuje tego problemu). Problem polega na często spotykanym podejściu: analiza wymagań tylko w postaci wywiadów i w konsekwencji niepełne zrozumienie specyfiki biznesowej oraz fakt, że developer ma skłonności do uproszczeń i “normalizacji”. Innym, moim zdaniem jeszcze gorszym podejściem, jest rozpoczęcie kodowania jeszcze w trakcie trwania wywiadów i tworzenie oprogramowania metodą codziennych, lub co tygodniowych spotkań z użytkownikiem opisującym kolejne aspekty systemu. Zbyt późne odkrywanie (a nie raz nawet niedostrzeganie tego), tego że pewne rzeczy są ‘tymi samymi rzeczami” ale w innych kontekstach, prowadzi do bardzo wielu problemów z implementacją. Ale po kolei.
Wymaganie: system ma pozwalać na wystawianie faktur VAT
Wyobraźmy sobie pozornie prosty problem: oprogramowanie CRM zawierające między innymi funkcjonalność fakturowania. Z reguły z wywiadów (analiza) dowiemy się, że w kilku miejscach różne osoby wystawiają faktury. Wzór faktury będzie załącznikiem, z kilku tak zwanych “user story” zostanie opracowany jeden (normalizacja user story) przypadek użycia “Wystawienie faktury VAT”, jego implementacja z reguły jest kompilacją treści kilku wywiadów (user story). Kilka różnych osób (role) dostanie prototyp do oceny, każdy zgłosi inne zmiany i oczekiwania, powoli powstaje bardzo złożony scenariusz przypadku użycia obłożony warunkowymi ścieżkami scenariusza realizacji tego przypadku użycia. Nie raz można spotkać bardzo skomplikowany “model procesu” wystawiania faktury z wieloma warunkami… Diagram przypadków użycia jednak, po czymś w rodzaju normalizacji, najczęściej przedstawiał by jedno wymaganie – wystawianie faktur VAT – i wyglądał by tak:

Analiza biznesowa krok po kroku
Model procesów biznesowych
Pierwszym krokiem powinna być jednak analiza polegająca na opracowaniu modeli procesów biznesowych. Celem tego modelowania jest wykrycie, udokumentowanie i zrozumienie każdego kontekstu wystawienia faktury, weryfikacja treści wywiadów (ludzie mają naturalne tendencje do pomijania rzeczy oczywistych i uwypuklania swojej roli w procesie) oraz upewnienia się, że znamy wszystkie sytuacje, w których wystawiana jest faktura VAT. Dlatego niezależnie od zakresu projektu warto zawsze opracować model procesów biznesowych całej organizacji.
Tu mała uwaga, model procesu to nie algorytm pracy a model obrazujący czynności i ich cele.Samo wystawianie faktur może mieć różne konteksty, może to robić więcej niż jedna osoba, a sposób w jaki to robi zależy od kompetencji tej osoby. W opisywanym przypadku mamy dwa takie konteksty. Faktura VAT za usługę wystawiana przez osobę o wysokich kwalifikacjach:

oraz faktura VAT za towar z magazynu wystawiana przez osobę nie mającą wiedzy lub uprawnień pozwalających na samodzielne wystawienie Faktury VAT – dla takiej osoby powstała dokładna procedura:

Jak widać diagramy nie są jest zbyt skomplikowane i takie powinny być. Model procesów biznesowych nie powinien zawierać w sobie wiedzy z innych obszarów takich jak : procedury, uprawnienia, umiejętności. Proces biznesowy ma ścisłą definicję (czynność lub czynności przekształcające stan wejścia w produkt procesu). Jak widać powyżej, czynności procesu są kojarzone z procedurami (tu komentarz) i rolami (tor ma modelu procesów). W powyższych przykładach procedury jawnie umieszczono na diagramie (to jedna z możliwych konwencji). W pierwszym przypadku procedura jest trywialna, wpisałem ją tylko dla zobrazowania jej prostoty co wynika z faktu, że kierownik projektu (PM) to osoba o wysokich kompetencjach, od której wymagamy (CV, rekrutacja) wiedzy o tym jak wystawiać faktury VAT. Informacja taka powinna być w dokumentacji skojarzona z rolą PM.
Na diagramach oznaczono czynności związane z fakturowaniem jako <<przypadek użycia>> (przyjęta tu konwencja, nie jest to element notacji BPMN, w której wykonano te diagramy).
Jak widać mamy więc dwa zupełnie różne konteksty wystawiania faktur w tej firmie. Oba są istotne i było by dużym błędem tworzenie dla nich jednego uniwersalnego scenariusza.
Model przypadków użycia
Jak poradzić sobie z fakturowaniem na dwa sposoby? Błędem było by proste uznanie, że mamy dwa przypadki użycia:

Powyższe sugeruje wykonanie dwóch implementacji, zapewne z powieleniem części kodu. Pojawienie się kolejnego nowego kontekstu, to tu kolejny przypadek użycia, będzie to wymagało dopisania kolejnego kodu. Powyższy diagram to nie najlepszy pomysł. Więc jak?
Tu pojawia się rola modelu dziedziny jako elementu dokumentacji wymagań. Nazywa się to czasem “wymagania dziedzinowe” w analizie biznesowej czyli zrozumienia i udokumentowanie biznesowych aspektów narzędzia (a nim jest zamawiane oprogramowanie), na które wymagania mają zostać wyspecyfikowanie.
Moim zdaniem model przypadków użycia, jako tak zwana czarna skrzynka, nie rozwiązuje żadnego problemu poza oczywiście wyspecyfikowaniem wymagań funkcjonalnych (co jest bardzo ważne!).
Dobry projekt będzie zawierał jednak, moim zdaniem, jeden przypadek użycia ale także konteksty ról. Nieco nadmiarowy diagram przypadków użycia z kontekstami:

Powyższy diagram modeluje “pomysł” z kontekstami. Oprogramowanie ma jeden przypadek użycia (system ma być prosty i łatwy w użyciu!). Diagram przedstawia dwóch aktorów (dwie role), jeden przypadek użycia (w projektach wole osobiście pojęcie “usługa systemu”, które jest łatwiejsze w komunikacji z użytkownikiem), oraz jego dwie specjalizacje po jednej dla każdego aktora (aktor jest połączony z właściwym przypadkiem użycia związkiem użycia). Powyższy diagram byłby trudny do zrozumienia przez Zamawiającego nie znającego dobrze notacji UML, różowe elementy umieściłem nadmiarowo dla zilustrowania tego artykułu). W dokumentacji dla klienta elementów oznaczonych na różowo nie umieszczam.
Nadal jest to jednak czarna skrzynka, która nie determinuje logiki biznesowej systemu. Czy powinna? Myślę, że tak, gdyż wyznaję zasadę, że rolą developera jest implementacja a nie modelowanie logiki organizacji , której nie zna. Zostawiając developera tylko z powyższym diagramem, bardzo ryzykujemy, że wykona co prawda oprogramowanie “w stanie na dzisiaj”, ale jego rozwój, wynikający z logiki biznesowej organizacji (np. planowanego jej rozwoju) może być trudny, kosztowny a nawet czasem niemożliwy.
Model dziedziny systemu
Dlatego jednak tworzymy model dziedziny systemu, nie narzucając (tu zgadzam się z programistami) metod rozwiązywania problemów implementacji (czyli na tym etapie nie praktyki DDD a raczej model analityczny BCE).
Nie umieszczamy więc na diagramie przypadków użycia kontekstów (powyżej przypadki użycia oznaczone kolorem różowym) a tworzymy model wewnętrznej logiki zawierającej informację o tych kontekstach. Model ten powinien być tak opracowany, by możliwe było łatwe dodawanie nowych kontekstów, bo to wynika ze specyfiki biznesu. Dodatkowo elementem biznesowym jest także to, że Zamawiający na dziś oczekuje możliwości pracy z pomocą komputera i tabletu, nie wyklucza w przyszłości innych urządzeń końcowych. Wymaganie to nie powinno prowadzić do powielenia przypadków użycia, nie powinno także komplikować elementów typowo dziedzinowych np. zarządzania kontekstami przypadku użycia.
Proponowany tu model dziedziny to kompletna logika dziedzinowa (komponent Model wzorca MVC, diagram klas w konwencji BCE/ICONIX)):

Powyższy model zawiera dwa dedykowane elementy, każdy dla konkretnego urządzenia końcowego, bez ingerencji w sam mechanizm fakturowania (klasa WystawienieFakturyVAT). To wzorzec architektoniczny MVVM. Klasa ta (jedna dla przypadku użycia!) zawiera odpowiednie scenariusze dla każdego kontekstu (klasy skomponowane o nazwach takich jak aktorzy, tu np. wzorzec projektowy strategia). Faktury VAT są zarządzane przez repozytorium faktur.
Model sterowania interakcją
Uzupełnieniem powyższego, diagram przypadków użycia i model dziedziny, powinien być model scenariusza realizacji przypadku użycia – diagram sekwencji (którego już tu nie prezentuję, był nie raz opisywany) oraz diagram sterowania interakcją (nie jest to diagram aktywności!):

Powyższy diagram pokazuje, kolejne ekrany (ich makiety powinna zawierać dokumentacja wymagań). Mam nadzieję, że nie powyższego szczegółowo wyjaśniać.
Na zakończenie
Powyższe to kompletne wymagania dla developera, które nie narzucają implementacji a jedynie oczekiwaną logikę tworzonego oprogramowania. Jeżeli w wymaganiach dodamy, że elementy Entities (tu “kapelusik” FakturyVAT) mają być rozdzielne, a w wypadku wątpliwości (niestety) narzucamy [[wzorzec active records]] (czasem [[wzorzec active table]]), to zabezpieczamy się przed bardzo częstą i szkodliwą praktyką wielu developerów, polegającą na projektowaniu repozytorium w postaci jednej dużej relacyjnej bazy danych dla całego systemu i stosowaniu bardzo złożonego mapowania ORM (mapowanie obiektowo-relacyjne), które w zasadzie zabije wszystkie korzyści z obiektowej ([[paradygmat OOAD]]) hermetyzacji (utrzymanie pełnej niezależności wszystkich elementów architektury). Drugim tego efektem jest z reguły drastyczny spadek wydajności z powodu bardzo wielu skomplikowanych zapytań do bazy danych.
Tak więc, warto prowadzić analizę rzetelnie, bez nadmiaru “zwinności” i z pełnym zrozumieniem problemu. Pochopne decyzje, rozpoczynanie implementacji bez posiadania projektu całości, to najczęstsze przyczyny nieudanych projektów, projektów trwających i kosztujących znacznie więcej niż planowano…
Bo najważniejsi w analizie, Panie, są Aktorzy…