Tag Archive : inżynieria systemów

Tak, taką książkę można nabyć na Amazonie ;). Streszczenie na stronach sprzedawcy oddaje dobrze jej treść:

This book provides a basic, conceptual-level description of engineering management disciplines that relate to the development and life cycle management of a system. For the non-engineer it provides an overview of how a system is developed. For the engineer and project manager it provides a basic framework for planning and assessing system development.

Ogólnie książka opisuje podstawowy koncepcyjny etap inżynierii systemów (i nie należy tego utożsamiać tylko z branżą IT). Jest napisana przystępnym językiem, adresowana  głównie dla managerów (pierwsze części) by zapoznać ich z inżynierią systemów i systemowym podejściem. Kierownikom projektów “pokazuje” czym (ewentualnie ;)) zarządzają.

Tu tylko kilka słów. Najpierw po raz kolejny cytat:

Problemy, w których rozwiązaniu mają pomóc budowane złożone systemy są zwykle ?problemami złośliwymi? (Rittel i Webber, 1973). ?Problem złośliwy? to taki skomplikowany problem, w którym jest tak wiele powiązanych ze sobą bytów, że nie istnieje jego ostateczna specyfikacja. Prawdziwy charakter problemu objawia się dopiero w miarę opracowywania rozwiązania.

A teraz diagram obrazujący “proces inżynierii systemowej” na bazie jednej z ilustracji w tej książce:

Proces inżynierii systemowej

Mamy tu trzy kluczowe etapy, powiązane iteracyjnie:

  1. Analiza wymagań, chodzi tu o wymagania biznesowe.
  2. Analiza funkcjonalności, chodzi tu o ustalenie do jakich “rzeczy’ system jest potrzebny (przeznaczony).
  3. Projektowanie czyli próba opracowania konstrukcji, mechanizmu działania tego systemu.

Trzeci punkt to właśnie klucz do sukcesu: zanim zaczniemy konstruowanie (np. pisanie kodu) warto opracować to rozwiązanie ‘na papierze”. To po pierwsze pozwala uniknąć ogromnych kosztów “rozpoznania bojem” a po drugie daje jako produkt bardzo dobrą (na wysokim poziomie abstrakcji ale kompletną) dokumentację działania systemu.

Niedawno cytowałem artykuł o porażce systemu e-border, tym razem innych cytat:

The Home Office had a concept, not a well-developed set of requirements. Concepts need a reality check; otherwise, you could be chasing a dream! Even though the program ran a pilot to evaluate the feasibility of the concept, the National Audit Office report (2015) claims that it did not cover all aspects of the solution. Consequently, the programme was executed with an untested concept and unknown requirements, which led to disputes. (Źródło: Blueprints Are Not Requirements!)

Jedną z głównych przyczyn porażki było rozpoczęcie realizacji projektu wyłącznie na bazie wizji, bez jakichkolwiek analiz i projektowania tego “co na prawdę ma powstać i w jakich warunkach”. Patrząc na zobrazowany powyżej proces inżynierii systemowej wykonano wyłącznie pierwszy etap (wymagania biznesowe) i przystąpiono do realizacji projektu bez jakichkolwiek analiz i projektowania, od razu zaczęły powstawać prototypy… Projekt e-border zakończył się spektakularną porażką.

Jedną z notacji OMG jest SysML. Jest to dedykowany dla inżynierii systemów profil UML. Odnosząc się do procesu inżynierii systemowej powyżej, powstają w tej notacji kolejne diagramy:

  1. diagram wymagań (lub ich specyfikacja),
  2. diagram przypadków użycia i ich specyfikacja,
  3. model dziedziny (mechanizm działania systemu: diagramy komponentów, klas i obiektów) oraz modele zachowania systemu (diagramy sekwencji, komunikacji, scenariusze przypadków użycia).

Powyższe to wymagane minimum dla poprawnego wyspecyfikowania systemu zanim powstanie choć jeden wiersz kodu czy wykop pod fundament.

Z informacji jakie posiadam, od lat rząd USA nie ponosi takich spektakularnych porażek projektowych jak europejskie rządy, jednak w przypadku projektów korporacyjnych już tak różowo nie jest :), wpadki mają wszystkie:

According to an often-quoted study from the Gartner Group, 75% of IT projects fail. The Standish Group conducts an annual survey of IT projects. Their latest report shows a decrease in project success rates.

  1. 32% of all projects succeeded: delivered on time, on budget, with required features.
  2. 44% were challenged: late, over budget, and/or with less than the required features.
  3. 24% failed: cancelled prior to completion or delivered and never used.

When we look back, we not only see failures but can clearly see the boom the software industry has been given with its success. But the worrying aspect is that there are failures that are recurring every year, maybe in a different organization but mostly with common causes. (Źródło: Blueprints Are Not Requirements!)

Polecam książkę 😉

Systems Engineering Fundamentals Kindle Edition by United States Government US Army (Author) (Źródło: Amazon.com: Systems Engineering Fundamentals eBook: United States Government US Army: Kindle Store)

Bardzo ciekawa książka, przydatna każdemu kto zajmuje się nie tylko inżynierią oprogramowania (ale tą także). Analiza systemowa, projektowanie systemów, to szersza dziedzina niż tylko IT. O ogólnej teorii systemów następna książka.

Modern Methods of Systems Enginieering to rodzaj podręcznika. Kolejne rozdziały opisują metody i narzędzia stosowane w projektach z obszaru szeroko pojętej inżynierii systemów. Można tu znaleźć opis procesów analizy systemowej, spis treści kluczowych dokumentów w kolejnych etapach prac. Co nieco o notacji SysML (Systems Modeling Language).

Opisana tu metoda i narzędzia pracy są zgodne (kompatybilne) z [[DoD Systems Engineering Fundamentals]], [[NASA Systems Engineering Handbook]] i [[INCOSE Systems Engineering Handbook]].

Książka jest adresowana zarówno do początkujących (poznają metodę analizy) jak i do doświadczonych analityków (porównają opisane tu metody ze tymi które sami stosują).

Końcowe rozdziału nawiązują do notacji UML i SysML. Książkę polecam jako opis metody a nie jako bogaty opis analizy. Bliżej jej do takich pozycji jak PMBook czy BABook niż do bogatych opisów teorii i praktyki analizy.

Tytuł: Modern Methods of Systems Enginieering: With an Introduction to Pattern and Model Based Methods

Autorzy: Joe Jenney (Author), Mike Gangl (Contributor), Rick Kwolek (Contributor), David Melton (Contributor), Nancy Ridenour (Contributor), Martin Coe (Contributor)

 

W grudniu 2011 roku napisałem na zakończenie pewnego artykułu o wymaganiach:

Większość projektów takich jak np. wdrażanie nowych metod kontrolingu, zrównoważonej karty wyników, nowych systemów IT itp. cierpi głównie z powodu posiadania nadmiaru informacji z jednej strony i kompletnego jej niezrozumienia z drugiej. Sławne już w badaniach ?złe i niekompletne wymagania? czy ?zmiany zakresu projektu w trakcie jego trwania? to klasyczne skutki złej (a często pomijania!) analizy biznesowej. Koszty tych porażek wielokrotnie przewyższają koszt takich analiz. (Analiza biznesowa ? skuteczne modelowanie a ryzyko projektu).

Specyfikowanie wymagań, zarządzanie wymaganiami, inżynieria wymagań, to jak widać bardzo trudny etap projektu. Trudność bierze się stad, że dostępne zalecenia określają, że wymagania maja być np. spójne i kompletne ale zupełnie nie opisują jak to osiągnąć (a nawet jak to sprawdzić).

 

Często można się spotkać z pojęciem “inżynieria wymagań”. Budzi ono mój opór z dwóch powodów: znaczenie słowa inżynieria w j.polskim i nieadekwatność tego słowa do dziedziny jaką jest specyfikowanie wymagań, które są po protu listą warunków.

Zajrzyjmy do słownika języka polskiego:

inżynieria ?projektowanie i konstruowanie obiektów oraz urządzeń technicznych?

wymaganie ?warunek lub zespół warunków, którym ktoś lub coś musi odpowiadać?

Więc jak rozumieć złożenie “inżynieria wymagań”? Ja nie wiem, chyba, że ktoś uważa, że wymagania się “konstruuje”, i że są to zagadnienia techniczne. Za to ma sens “inżynierii systemów”. Mamy def. pojęcia system:

system ?układ elementów mający określoną strukturę i stanowiący logicznie uporządkowaną całość?

Gdyby definicje słowa “inżynieria” okroić z “technicznych” albo uznać, że systemy są także nie techniczne (bo są np. społeczne)  to mamy wdzięczna definicję:

inżynieria systemów ?projektowanie i konstruowanie układów elementów mających określoną strukturę i stanowiący logicznie uporządkowaną całość?

Jeden z moich ulubionych autorów akademickich, Ian Sommeville (lubię go także za to, że książki pisze w pubach popijając piwo ;)) definiuje inżynierię wymagań tak:

Requirements engineering (RE) refers to the process of formulating, documenting and maintaining software requirements (źr. Kotonya G. and Sommerville, I. Requirements Engineering: Processes and Techniques. Chichester, UK: John Wiley & Sons)

(pojęcie inżynierii wymagań odnosi do procesu formułowania, dokumentowania i zarządzania wymaganiami)

Tak więc uznając, że wymagania na systemy to element inżynierii tych systemów, niniejszym godzę  się używać pojęcia “inżynieria wymagań” w znaczeniu jakim opisał to Sommerville :).

Po co tyle ględzenia o słowach i ich znaczeniach? Poza “szukaniem” alibi dla istnienia pojęcia “inżyniera wymagań” chcę pokazać, że słowa mają znaczenie, zaniedbywanie tego prowadzi do wielu nieporozumień (niejednoznaczność) a po drugie zwracam uwagę, że analiza pojęciowa to jeden z kluczowych elementów analizy w ogóle (i często zaniedbywana).

Skoro wymagania to warunki, to aż prosi się by te warunki sprawdzać. Patrzmy do słownika:

sprawdzać ?skontrolować, zbadać, czy coś jest zgodne z prawdą, czy coś zostało zrobione prawidłowo?

Tak więc wniosek jest prosty:  wymaganie (każde!) powinno być sprawdzalne! Bez tego nie jesteśmy w stanie określić czy “coś” spełnia te wymagania, czyli czy zdanie: “dostarczony produkt jest zgodny z wymaganiami” jest prawdziwe czy nie (a nie chcemy oddać rozstrzygania tego prawnikom ;)).

Inżynieria wymagań

Skoro więc ugiąłem się i uznałem pojęcie inżynierii wymagań, popatrzmy na to systemowo. Jak zawsze proste jest piękne więc co analizujemy w inżynierii systemowej i inżynierii wymagań:

Granice systemu

 

matrioszkaPojęcie “system” to także supersystem (system nadrzędny)  i podsystem (system podrzędny, część systemu). To troszkę jak znane wam, być może, matrioszki 🙂 (figurki jedna w drugiej…).

Jest to, nazewnictwo, bardzo ważne, bo w jednym projekcie (dokumentacji) należy zachować bezwzględną dyscyplinę pojęciową, czyli słowo System powinno się odnosić wyłącznie do konkretnego poziomu  opisu, reszta to elementy systemu nadrzędnego lub podrzędnego.

Mianem system określa się zwyczajowo specyfikowane oprogramowanie, jednak problem pojawi się natychmiast, gdy dotkniemy takich pojęć jak wymagania funkcjonalne na oprogramowanie i wymagania biznesowe. To ostatnie niesie pewną niejasność. Bo nie wiem czy chodzi o wymagania wobec (w stosunku do) biznesu (np. poprawa jakości obsługi klienta o 5% w najbliższym badaniu jakości ISO) czy wymagania biznesu wobec (w stosunku do) oprogramowania (np. minimalizacja do zera otrzymanych i zagubionych zapytań ofertowych).

Popatrzmy na powyższy diagram. Mamy tu dwa Systemy:

  1. Organizacja jest podsystemem, jest elementem systemu, którym tu jest rynek na jakim ta organizacja  funkcjonuje.
  2. Organizacja jest analizowanym systemem, oprogramowanie jest jednym z zasobów tej organizacji (oprogramowanie jest tu podsystemem).

Wymagania możemy tu odnosić  w stosunku do Organizacji i w stosunku do Oprogramowania. To dlatego jasno wyodrębniamy analizę biznesową (produktem są modele biznesowe i wymagania biznesowe) od analizy wymagań na oprogramowanie (modele i wymagania na oprogramowanie). Jak widać wymagania na oprogramowanie to wymagania, których źródłem jest biznes, który ma konkretne cele do osiągnięcia. Nie powinny być one pobożnymi życzeniami użytkowników, aż do momentu gdy sponsor projektu nie powie np.: moim celem jest wygoda pracy moich pracowników. Oczywiście, ta wygoda jest zawsze wymagana ale nie musi ona być celem samym w sobie i nie musi mieć najwyższego priorytetu.

 

Wymagania interesariuszy. Moja definicja interesariusza (jedna z wielu): osoba (podmiot) zainteresowana zaistnieniem produktu, na którą pojawienie się produktu ma wpływ. Nie raz jestem pytany czy interesariusz ma prawo zgłaszania wymagań. Jeżeli ma coś do powiedzenia podczas odbioru produktu to znaczy, że ma wymagania. One mogą być jednak niejawne czyli taki interesariusz nie zgłasza wymagań ale ma wpływ na odbiór produktu, należy go koniecznie zidentyfikować. Jeżeli zaś ktoś nie ma nic do gadania przy odbiorze produktu nie jest interesariuszem (ang. stakeholder, kluczem jest tu ‘holder’ czyli dysponent mający coś do powiedzenia, mający wpływ). Tak wiec interesariusz to ktoś kto, na swoim poziomie ogólności, także musi umieć określić, kiedy uzna, że produkt spełnia jego wymagania. Jak nie potrafi, ktoś musi mu pomóc…analityk :)).

I tu rola analityka. Interesariusz spisuje co mu przyjdzie do głowy swoim językiem, analityk upewnia się, że zrozumiał, doprowadza je do postaci testowalnej  i klasyfikuje “wymagania” jako “źródło: konkretny interesariusz” (bo każde wymaganie musi mieć właściciela). Proszę zwrócić uwagę, że interesariuszem jest także użytkownik jeżeli tylko ma coś go powiedzenia w projekcie :).

Popatrzmy na wymaganie:

Wymagania

 

Wymaganie jest jedno (warunek jaki coś musi spełnić) ale może ono mieć wiele atrybutów i tu widzę “złożoność” wymagań (ich [[taksonomia]]).  Zarówno “wystawianie faktur VAT” jak i “dostępność 99,99% czasu” to równoprawne wymagania bo oprogramowanie np. wspomagające sprzedaż jest bezwartościowe zarówno gdy nie pozwala wystawiać faktur jak wtedy, gdy często się psuje. Owszem, jedno jest funkcjonalne drugie jest poza-funkcjonalne ale jedno i drugie to “równoprawny warunek przydatności” czyli Wymaganie wobec oprogramowania.

Jak wspomniałem, wymagania są (warto tak robić) klasyfikowane za pomocą atrybutów. Najczęściej spotykane to: rodzaj (Kind), źródło wymagania (Source), polecam także priorytet, metodę weryfikacji (np. test, audyt zgodności z opisem w dokumentacji), status (planowane, zaakcpetowane, odrzucone, …) i inne, zależnie od wymagań i typu projektu.

Ważna uwaga i zalecenie IIBA: zarządzanie  wymaganiami “zabrania” ich usuwania (albo renumeracji po usunięciu). usuwanie powoduje to niespójność wersjonowanej dokumentacji, która także ma swój cykl życia. Ja od dłuższego czasu stosuję dodatkowy status “odrzucone”, co daje mi ciągłość dokumentacji a także pozwala na “odwieszenie” wcześniej zdefiniowanego wymagania, gdy ktoś jednak uzna, że coś co było zbędne nagle znowu staje się konieczne :).

 

Liczba pytań i sugestii (także na kilku forach dyskusyjna) skłoniła mnie do podjęcia próby  zbudowania taksonomii wymagań. Jak już wspomniałem wyżej, zalecenia takie jak FURPS to niestety tylko płaska lista “cech” (i nie wszystkich). Wydaje mi się, że struktura wymagań, ich taksonomia wzajemne zależności oraz relacje do udziałowców projektu (interesariusze) i przyszłych użytkowników   rozwiązania, wymagają bardziej formalnego podejścia. Celem jest uzyskanie możliwości sprawdzania czy wymagania – jako przedmiot inżynierii wymagań – spełniają jakieś, trzeba je stworzyć, wymagania.

Taksonomia wymaganPowyżej próba usystematyzowania “wymagań” na bazie wyżej cytowanych definicji tego pojęcia.

Na koniec jeszcze kolejna ważna rzecz. Warto wskazywać, które elementy logiki biznesowej (Model) odpowiadają (są powiązane) z danym wymaganiem bo np. szczegółowo opisują wymagany sposób realizacji danego wymagania (np. system upustów albo konkretny przypadek użycia, także Model). Warto także, jeżeli  opis wymagania nie jest testem, zaprojektować test (przypadek testowy), który potwierdzi spełnienie wymagania np. “oprogramowanie ma pozwalać na wyliczanie pierwiastków drugiego i trzeciego stopnia”. Tu warto podać kilka konkretnych danych wejściowych wraz z prawidłowymi wynikami (może to dotyczyć nap. tabeli upustów, systemu skoringu klientów itp.).

Tego typu metody maja nazwę deklaratywnych:

Programowanie deklaratywne ? rodzina paradygmatów programowania, które nie są z natury imperatywne. W przeciwieństwie do programów napisanych imperatywnie, programista opisuje warunki, jakie musi spełniać końcowe rozwiązanie (co chcemy osiągnąć), a nie szczegółową sekwencję kroków, które do niego prowadzą (jak to zrobić). Programowanie deklaratywne często traktuje programy jako pewne hipotezy wyrażone w logice formalnej, a wykonywanie obliczeń jako ich dowodzenie. Programowanie deklaratywne jest szczególnym przedmiotem zainteresowania naukowców, gdyż dzięki minimalizacji lub eliminacji skutków ubocznych może znacząco uprościć tworzenie programów współbieżnych. Paradygmat programowania deklaratywnego obejmuje szeroką gamę języków programowania i bardziej szczegółowych paradygmatów podrzędnych. (Programowanie deklaratywne ? Wikipedia, wolna encyklopedia).