Jakie powinno być oprogramowanie dla dużych organizacji?
Ponieważ od wielu lat zajmuję się realizacją i wdrożeniami oprogramowania wspierającego procesy biznesowe w dużych organizacjach zebrało mi się sporo przemyśleń na temat specyfiki tej pracy, trudności które najczęściej wdrożeniowców czekają oraz sposobów radzenia sobie z typowymi przy takich projektach problemami. Dziś zatem będzie o tym w jaki sposób dobrze zaprojektowane oprogramowanie może pomagać nam w realizacji skomplikowanych projektów. Artykuł ten jest wyjaśnia też dlaczego projektując NGinn starałem się uwzględnić  pewne cechy oprogramowania które uważam za pomocne przy realizacji potrzeb naszych klientów.
Wdrożenie
MówiÄ…c o wdrożeniu systemu w dużej organizacji mam na myÅ›li firmy liczÄ…ce kilka tysiÄ™cy pracowników gdzie wdrażany system ma spory ‘zasiÄ™g rażenia’, czyli obejmuje istotnÄ… część personelu firmy i w jakiÅ› sposób dotyczy istotnych dla biznesu tej firmy procesów. PrzykÅ‚adem takiego oprogramowania sÄ… systemy CRM, wsparcia klientów, obsÅ‚ugi zamówieÅ„/zleceÅ„ lub też systemy wspierajÄ…ce wewnÄ™trzne procesy w dużych firmach – HR, zakupy wewnÄ™trzne, helpdesk IT etc. W takim Å›rodowisku wymagania najczęściej nie pochodzÄ… od jednej osoby ale sÄ… jakÄ…Å› wypadkowÄ… potrzeb i planów rozwojowych wielu osób z różnych działów danej firmy. Oznacza to że prowadzÄ…c wdrożenie musimy współpracować z wieloma ‘wÅ‚aÅ›cicielami biznesowymi’ jednoczeÅ›nie, najczęściej bÄ™dÄ… to managerowie jednostek organizacyjnych w których wprowadzamy nasz system. Wiele źródeÅ‚ wymagaÅ„ oznacza potencjalne rozbieżnoÅ›ci w specyfikacji potrzeb no i różne sposoby interpretacji tego co zostaÅ‚o ustalone  - prawdopodobnie nie da siÄ™ wszystkiego uzgodnić tak żeby specyfikacja byÅ‚a spójna, kompletna, niesprzeczna i na dodatek tak samo rozumiana przez wszystkie strony. OczywiÅ›cie należy do tego dążyć, ale wg mnie trzeba na jakimÅ› etapie odpuÅ›cić i uznać że tak po prostu jest że każdy chce czego innego i na co innego zwraca uwagÄ™. Problem jest taki że system musi być oparty na niesprzecznej wewnÄ™trznie logice no i zapewnienie logicznoÅ›ci tej logiki to wÅ‚aÅ›nie nasze zadanie, ale myÅ›lÄ™ że aby pracÄ™ w ogóle daÅ‚o siÄ™ zacząć to wystarczy ustalić kwestie podstawowe, zÅ‚apać jaki-taki obraz caÅ‚oÅ›ci i pilnować żeby każdy wÅ‚aÅ›ciciel biznesowy na koÅ„cu dostaÅ‚ to na czym mu zależy. Przy takim podejÅ›ciu musimy dopuÅ›cić możliwość robienia wyjÄ…tków od ustalonych przez wszystkich reguÅ‚, na przykÅ‚ad ustalajÄ…c że system zaoferuje innÄ… niż dla caÅ‚ej reszty firmy procedurÄ™ pracy lub zawartość formatki dla pracowników jakiegoÅ› dziaÅ‚u X bo akurat manager tego dziaÅ‚u chce inaczej zarzÄ…dzać u siebie pracÄ…. Zamiast zmuszać wszystkich wÅ‚aÅ›cicieli biznesowych do uzgodnienia jednego wspólnego stanowiska w tej sprawie po prostu uwzglÄ™dniamy potrzeby X w budowanym systemie tak aby nie miaÅ‚o to wpÅ‚ywu na pozostaÅ‚ych.
A co ze stroną techniczną przy takim podejściu? W sumie to każdy system może uwzględnić rozbieżne wymagania i wyjątki (oraz wyjątki od wyjątków) w logice biznesowej, różnice są tylko w sposobie implementacji takich wymagań, stopniu komplikacji wynikowego systemu oraz nakładzie pracy koniecznym do implementacji i późniejszego utrzymania systemu. Jest natomiast kilka cech oprogramowania które takie zadania ułatwiają:
- oddzielenie logiki biznesowej od infrastruktury. Oprogramowanie powinno w przejrzysty sposób dzielić siÄ™ na infrastrukturÄ™ (czyli komponenty odpowiedzialne za podstawowe funkcje systemu które siÄ™ nie zmieniajÄ… z wdrożenia na wdrożenie) oraz na ‘logikÄ™ biznesowÄ…’ czyli specyficzne dla klienta struktury danych, GUI, formularze, szablony dokumentów i reguÅ‚y wedÅ‚ug których system realizuje funkcje uzgodnione z klientem. Najlepiej żeby podziaÅ‚ na infrastrukturÄ™ i logikÄ™ byÅ‚ silny, tzn każdy komponent powinien być jednoznacznie przypisany do jednej z tych grup, a dodatkowo infrastruktura powinna być na tyle dobrze zaprojektowana żeby implementacja kolejnych funkcji biznesowych nie wymagaÅ‚a omijania ani modyfikacji infrastruktury.
- możliwość wprowadzania lokalnych zmian w logice. To szeroki temat, ale chodzi o to aby uwzglÄ™dniajÄ…c czyjeÅ› specjalne potrzeby można byÅ‚o dziaÅ‚ać ‘lokalnie’ nie wpÅ‚ywajÄ…c na pozostaÅ‚e funkcje systemu, na przykÅ‚ad zaoferować dla wybranych użytkowników specjalnÄ… wersjÄ™ formatki bez modyfikowania formatki ‘ogólnej’, tj tej dostÄ™pnej dla wszystkich, albo zmienić reguÅ‚y rzÄ…dzÄ…ce przepÅ‚ywem okreÅ›lonego typu dokumentów bez modyfikowania reguÅ‚ ogólnych którym podlegajÄ… wszystkie inne dokumenty.  I odwrotnie  - system w którym caÅ‚a logika jest zapisana w jednym pliku z kodem źródÅ‚owym w postaci gigantycznego i wielokrotnie zagnieżdżonego if-else na pewno nie speÅ‚nia tej reguÅ‚y i jest bardzo trudny do modyfikacji.
- zwiÄ™zÅ‚y, przejrzysty i najlepiej samo-dokumentujÄ…cy siÄ™ sposób zapisu logiki biznesowej. Struktura musi być Å‚atwa do zrozumienia i zobrazowania, dziÄ™ki temu bÄ™dziemy w stanie zapanować nad wieloÅ›ciÄ… reguÅ‚ i wyjÄ…tków od nich. Można taki cel osiÄ…gnąć np przez wprowadzenie specjalizowanego jÄ™zyka ‘wyższego poziomu’ do zapisywania logiki biznesowej, np w postaci reguÅ‚ if-then-else albo procesów w okreÅ›lonej notacji, tudzież opartego o XML jÄ™zyka opisu wyglÄ…du formatek
Zmiana
WracajÄ…c do samego wdrożenia, chyba najważniejszym problemem z którym sobie musimy poradzić jest zmiana. Zmiany w dużych organizacjach to norma, możemy być pewni że w momencie uruchomienia systemu po raz pierwszy zacznie pÅ‚ynąć strumyczek wniosków racjonalizatorskich, żądaÅ„ zmian i pomysłów na kolejne zastosowania systemu. Dla nas powinna to być okazja do robienia biznesu a nie rzecz z którÄ… należy walczyć – należy klienta zachÄ™cać do zmian i je realizować, problem tylko w tym jak to zrobić żeby nie wpaść przy okazji po szyjÄ™ w bagno. A bagno pojawia siÄ™ kiedy na skutek radosnej twórczoÅ›ci klienta  (przy naszym współudziale) system robi siÄ™ bardzo skomplikowany, reguÅ‚y niejasne, niespójne i czasami siÄ™ wykluczajÄ…ce i pojawiajÄ… siÄ™ dziwne ‘błędy’ za które jesteÅ›my obarczani odpowiedzialnoÅ›ciÄ…. A wina nie zawsze jest po naszej stronie – no bo po kilku latach rozwoju systemu w firmie sytuacja zwykle przedstawia siÄ™ tak:
- nikt po stronie klienta nie ma pełnego obrazu tego jakie funkcje i w jaki sposób system realizuje. Po prostu nie ma takiej osoby bo różne wymagania pochodziły od różnych ludzi, w różnym czasie i nie ma nikogo kto by to potrafił albo chciał uzgodnić
- ludzie którzy definiowali jakieś funkcje i ustalali z nami sposób ich działania albo już nie pracują, albo nie pamiętają, albo nie chcą pamiętać, albo dostali inne zadania i już nie biorą udziału w projekcie
- nowi managerowie nie biorÄ… odpowiedzialnoÅ›ci za nic bo ‘to nie oni ustalali’. MówiÄ… tylko że w systemie jest błąd bo nie pasuje do ich koncepcji.
- Dokumentacja nic nam nie pomoże, po prostu jest zbyt ogólna i fragmentaryczna. Nie sposób spisać każdego szczegółu.
- Jeśli się pilnowaliśmy to mamy rejestr wprowadzanych zmian. Świetnie, ale to nic nam nie pomoże bo jest tego tyle że trzeba nadludzkich możliwości żeby analizując poszczególne zmiany ustalić jaki powinien być aktualny stan systemu. Poza tym wiele drobiazgów było załatwiane na gębę/telefon/maila i nie ma już po tym śladu
- Może nawet mamy specyfikacjÄ™ systemu i wiemy co i dlaczego w nim dziaÅ‚a tak jak dziaÅ‚a (o, super!) ale system i tak ‘źle dziaÅ‚a’ bo w miÄ™dzyczasie u klienta byÅ‚a reorganizacja, np cześć procesu zostaÅ‚a ‘outsorcowana’, wprowadzono nowe grupy, inne zasady rozliczeÅ„ itp itd. OczywiÅ›cie to nasz problem a nie klienta, no bo przecież wymagania mówiÄ… że system ma realizować jakiÅ› tam cel a nagle przestaÅ‚.
WÅ‚aÅ›ciwie wszystkie powyższe punkty przerabiaÅ‚em, myÅ›lÄ™ że każdy informatyk który pracuje z klientami również byÅ‚by gotów siÄ™ z wiÄ™kszoÅ›ciÄ… zgodzić. I myÅ›lÄ™ też że nie ma skutecznego sposobu który by pozwalaÅ‚ sobie z tym poradzić. Ale trzeba zacisnąć zÄ™by i z tym żyć (albo zmienić pracÄ™ na jakÄ…Å› mniej stresujÄ…cÄ…), dobrze też jest mieć jakieÅ› oparcie w oprogramowaniu – a oto cechy które uważam za bardzo pożądane w takiej sytuacji:
- Wszystkie 3 punkty o których pisałem wyżej przy okazji specyfikacji wymagań, oraz:
- Możliwość współistnienia kilku wersji logiki biznesowej. Na przykÅ‚ad jednoczesnego dziaÅ‚ania w oparciu o starÄ… logikÄ™ i nowÄ… logikÄ™ – po prostu, stare sprawy biegnÄ… wg starych reguÅ‚, nowo zakÅ‚adane – wg nowych. To bardzo uÅ‚atwia migracje. To pozwala też na robienie zmian lokalnych o których pisaÅ‚em wczeÅ›niej – czyli takich co obejmujÄ… tylko niektórych użytkowników nie wprowadzajÄ…c zamieszania u pozostaÅ‚ych. No i uÅ‚atwia ewentualny rollback do poprzednich wersji jeÅ›li nowa nie okaże siÄ™ takim sukcesem jak siÄ™ wydawaÅ‚o.
- Samo-dokumentacja (również wspomniany wcześniej). Logika biznesowa powinna być zapisana tak, żeby łatwo można było ustalić aktualny sposób działania systemu. Na przykład strukturalny zapis w postaci reguł if-then-else pozwala nam narysować drzewo decyzyjne wg którego system podejmuje jakieś działania, a np zapis procesów biznesowych w jakiejś strukturalnej notacji pozwala uzyskać diagram aktualnego przepływu dokumentów w firmie.
- Możliwość wprowadzania zmian w locie. To jest istotne bo duże organizacje czÄ™sto pracujÄ… 24×7 i system jest tak samo potrzebny zarówno w dzieÅ„ jak i w nocy. Nie można sobie pozwolić na dÅ‚ugie przestoje, zwÅ‚aszcza kiedy zmian jest dużo i sÄ… wprowadzane bardzo czÄ™sto, nawet ad-hoc gdy ktoÅ› zaobserwuje że system dziaÅ‚a niezgodnie z oczekiwaniami i trzeba to szybko naprawić.
- Możliwość wprowadzania zmian lokalnie, bez zatrzymywania pozostaÅ‚ych komponentów systemu – trochÄ™ zwiÄ…zane z poprzednim, ale chodzi o to aby do wprowadzenia zmian w jakiejÅ› funkcji systemu nie trzeba byÅ‚o  wyłączać caÅ‚ego systemu a zasiÄ™g naszych dziaÅ‚aÅ„ byÅ‚ tak maÅ‚y jak to tylko możliwe.
- Cała logika biznesowa powinna być przechowywana w postaci plików tekstowych. Dlatego że w ten sposób łatwo śledzić zmiany np za pomocą systemu kontroli wersji. Wszelkie formaty binarne (np z graficznych designerów), bloby w bazie danych,  bardzo utrudniają pracę.
- Strukturalny podziaÅ‚ logiki biznesowej wedÅ‚ug funkcji realizowanych przez system a nie czegoÅ› innego (chociażby np obiektów w bazie relacyjnej). Biznesowo widziane funkcje systemu majÄ… charakter przekrojowy – obejmujÄ… wiele fragmentów aplikacji, takich jak struktura danych w bazie, GUI, uprawnienia, specyficznÄ… dla danej funkcji logikÄ™, powiadomienia email, szablony dokumentów, raporty itp itd. Wszystko to może skÅ‚adać siÄ™ na jednÄ… logicznÄ… funkcjÄ™, o nazwie np ‘obsÅ‚uga pÅ‚atnoÅ›ci’ albo ‘obsÅ‚uga komunikacji z dostawcami’. Dobrze by byÅ‚o żeby struktura systemu grupowaÅ‚a te elementy w pakiety wedÅ‚ug logicznych funkcji, wtedy Å‚atwo ustalić które elementy systemu biorÄ… udziaÅ‚ w realizacji okreÅ›lonych wymagaÅ„ i jaki bÄ™dzie zakre zmian w systemie przy modyfikacji okreÅ›lonej funkcji. Istotna jest też separacja – dwie różne funkcje raczej nie powinny wykorzystywać tych samych fragmentów logiki biznesowej czy GUI, nawet jeÅ›li sÄ… one bardzo podobne. A to dlatego że wprowadzajÄ…c zmiany dla jednej grupy użytkowników nie chcemy przy okazji psuć czegoÅ› pozostaÅ‚ym. ‘Code reuse’ to dobra rzecz ale nie tutaj.
- PreferujÄ™ systemy ‘miÄ™kkie’ – tzn skryptowe, interpretowane, dynamiczne – w przeciwieÅ„stwie do statycznie typowanych, kompilowanych, buildowanych, package’owanych i deployowanych. Chodzi o modyfikacje logiki biznesowej, konfiguracji, uprawnieÅ„ czy GUI. Infrastruktura może być kompilowana i niezmienialna po wdrożeniu, ważne aby logika byÅ‚a modyfikowalna. DziÄ™ki temu możemy dokonywać szybkich poprawek, mini-wdrożeÅ„, szybkich testów nowej funkcjonalnoÅ›ci itp. Generalnie uważam że logika biznesowa powinna być zapisywana w jÄ™zykach skryptowych (przy czym wybieramy takie jÄ™zyki które najlepiej siÄ™ nadajÄ… do okreÅ›lonego celu), zaÅ› infrastruktura w jÄ™zykach niższego poziomu – C#, C++, Java itp.
- Cechy powyższe pozwalajÄ… nam też zmienić podejÅ›cie do testowania i prototypowania nowych funkcji. MajÄ…c możliwość wrzucenia nowej wersji logiki bez wyłączania starej możemy przeprowadzać testy nowych czy zmodyfikowanych funkcji na produkcji – po prostu udostÄ™pniajÄ…c je wybranej grupie testerów. Po potwierdzeniu poprawnego dziaÅ‚ania włączamy funkcjÄ™ dla wszystkich użytkowników. Bardzo czÄ™sto testy obejmujÄ… nie tylko zmiany w systemie, ale również zmiany w organizacji – klient po prostu chce realizować nowy proces posÅ‚ugujÄ…c siÄ™ naszym narzÄ™dziem i chce go sobie przetestować na jakiejÅ› maÅ‚ej grupie ludzi. W takim przypadku testowanie na produkcji jest czymÅ› naturalnym i bardzo uÅ‚atwia późniejsze uruchomienie ‘oficjalne’. Jest to też zachÄ™ta dla klienta do eksperymentowania – zwykle sprawdzenie czegoÅ› ‘na żywo’ jest lepsze, szybsze i taÅ„sze niż pisanie dokumentów z wymaganiami i analizowanie tematu ‘na sucho’.
Wydajność
Sprawa wydajnoÅ›ci jest bardzo ważna – możemy dowolnie rozwijać i modyfikować nasz system, ale musi on zapewniać wydajność wystarczajÄ…cÄ… do obsÅ‚użenia wszystkich nowych pomysłów. A jeÅ›li odnieÅ›liÅ›my sukces to klient bÄ™dzie chciaÅ‚ objąć wdrożeniem jakieÅ› nowe obszary organizacji co oznacza wiÄ™cej danych, wiÄ™cej użytkowników no i wiÄ™cej funkcji w aplikacji. W niektórych przypadkach rozwój systemu jest tak szybki że przerasta to nasze oczekiwania oraz możliwoÅ›ci systemu który nie byÅ‚ projektowany do tak dużego obciążenia. W tym miejscu kilka uwag na temat potencjalnych ‘min’ wydajnoÅ›ciowych:
Uwaga na relacyjne bazy danych. Mimo że relacyjna baza danych to podstawa bez której nikt nie wyobraża sobie aplikacji biznesowej to jednak jest to narzÄ™dzie które ma swoje ograniczenia. Po pierwsze jest ’sztywna’ – wymaga uzgodnienia struktur danych i trzymania siÄ™ ich. Tabela w bazie jest taka sama dla wszystkich przechowywanych w niej obiektów, nawet jeÅ›li różniÄ… siÄ™ one od siebie na poziomie aplikacji. Bazy danych nie obsÅ‚ugujÄ… dziedziczenia. Nie można wprowadzać zmian lokalnie – albo zmieniasz całą tabelÄ™ albo nic, zmiana struktury danych dotyczy wszystkich miejsc systemu które siÄ™ do niej odwoÅ‚ujÄ…. Druga sprawa to wielkość bazy danych – jeÅ›li chcesz wprowadzić zmiany w tabeli która liczy sobie miliony rekordów licz siÄ™ z tym że może to być bardzo dÅ‚ugotrwaÅ‚y proces albo nawet i niewykonalny (!). Na przykÅ‚ad dodanie nowej kolumny do rekordu aktualizuje nam wszystkie stare rekordy które już sÄ… w bazie – rozmiar rekordu siÄ™ zwiÄ™ksza i nastÄ™puje reorganizacja caÅ‚ej tabeli która może trwać nawet kilka godzin. A nasz czas na serwis to 30 minut… niby prosta zmiana a nie do zrobienia. Trzecia sprawa to wydajność samej bazy – rozwój systemu to coraz wiÄ™ksza jego komplikacja i coraz bardziej zÅ‚ożone transakcje w bazie danych. Transakcyjność to bardzo fajna rzecz ale potrafi również mocno ograniczyć wydajność aplikacji poprzez nakÅ‚adanie blokad wykluczajÄ…cych współbieżne wykonywanie operacji. Na dodatek nie bardzo można zwiÄ™kszać wydajność systemu przez doÅ‚ożenie kolejnej bazy danych – najczęściej baza musi być jedna no bo chcemy dziaÅ‚ać na jednej, aktualnej wersji danych a nie na kilku niezsynchronizowanych kopiach. Dobrze jest przemyÅ›leć te rzeczy na jakimÅ› wczesnym etapie bo im wiÄ™cej danych siÄ™ nagromadzi tym mniejsze mamy możliwoÅ›ci manewru.
Kolejna sprawa to komunikacja miÄ™dzy komponentami systemu oraz miÄ™dzy systemem a innymi aplikacjami z którymi jest zintegrowany. Należy uważać na komunikacjÄ™ synchronicznÄ… – mimo że wydaje siÄ™ fajnym pomysÅ‚em na poczÄ…tku to może nam mocno obciąć wydajność caÅ‚ej aplikacji. Kluczowe operacje w systemie należy rozbić na jak najmniejsze kawaÅ‚ki, tak aby transakcje miaÅ‚y niewielki zasiÄ™g i wykonywaÅ‚y siÄ™ szybko. ResztÄ™ operacji można dokoÅ„czyć asynchronicznie. PrzykÅ‚ad: podczas rejestracji nowego dokumentu przez użytkownika pozyskujemy wymagane dane od użytkownika i rejestrujemy dokument w bazie. Wszelkie operacje dodatkowe, takie jak powiadomienie o nowym dokumencie innych systemów, wysÅ‚anie emaili, indeksowanie dokumentu itp robimy później, offline, po zakoÅ„czeniu interakcji z użytkownikiem i zamkniÄ™ciu tej pierwszej transakcji w bazie danych.  KomunikacjÄ™ z systemami zewnÄ™trznymi robimy w tle bo nigdy nie wiadomo jak dÅ‚ugo przyjdzie nam czekać na odpowiedź. Tak samo jeÅ›li oferujemy jakÄ…Å› usÅ‚ugÄ™ (np web service) dla systemów zewnÄ™trznych – gdy zrobimy to w wersji synchronicznej może siÄ™ okazać że zewnÄ™trzne aplikacje po prostu ‘zarzynajÄ…’ nasz system. Bardzo dobrym pomysÅ‚em jest wykorzystanie architektury opartej o ‘message bus’ tj mechanizm asynchronicznego przekazywania komunikatów miÄ™dzy komponentami systemu – w takiej architekturze naturalne jest podejÅ›cie asynchroniczne. Temat jest godny jakiegoÅ› rozwiniÄ™cia, ale to kiedy indziej.
NGinn
OczywiÅ›cie nie mogÄ™ tutaj pominąć NGinn – jest to narzÄ™dzie które projektowaÅ‚em biorÄ…c pod uwagÄ™ wszystko co napisaÅ‚em wyżej (i pewnie jeszcze trochÄ™ spraw o których nie napisaÅ‚em). NGinn jest mojÄ… odpowiedziÄ… na problem realizacji skomplikowanych i ciÄ…gle zmiennych wymagaÅ„ w rozbudowanych systemach. OczywiÅ›cie jeden NGinn nie zaÅ‚atwi wszystkiego, jest to tylko workflow engine  i nie obejmuje na przykÅ‚ad GUI systemu, ale skutecznie stosuje opisane tu reguÅ‚y do realizacji logiki biznesowej systemu. A to dlatego  że:
- Proces w NGinn opisuje nam logikÄ™ systemu potrzebnÄ… do realizacji okreÅ›lonego procesu biznesowego, tj zawiera opis konkretnej funkcji biznesowej systemu, od poczÄ…tku do koÅ„ca. Procesy grupowane sÄ… w pakiety które oprócz samej definicji procesu mogÄ… przenosić dodatkowe elementy potrzebne do realizacji danej funkcji biznesowej – np szablony powiadomieÅ„, logikÄ™ integracyjnÄ…, etc
- NGinn obsÅ‚uguje wersjonowanie procesów – procesy mogÄ… współistnieć w wielu wersjach jednoczeÅ›nie, wprowadzanie nowej wersji procesu nie wymaga wyłączenia starej ani migracji
- Można modyfikować istniejące procesy bez zatrzymywania systemu.
- Struktury danych w NGinn sÄ… dynamiczne – modyfikujÄ…c proces można zmieniać definicjÄ™ jego danych, nie pociÄ…ga to za sobÄ… koniecznoÅ›ci modyfikacji struktury bazy danych lub aktualizacji innych procesów które już siÄ™ toczÄ….
- Asynchroniczny w zaÅ‚ożeniach – NGinn polega głównie na asynchronicznej komunikacji miÄ™dzy komponentami oraz miÄ™dzy NGinn a Å›wiatem zewnÄ™trznym. WewnÄ™trznie NGinn używa kolejki komunikatów do przesyÅ‚ania informacji pomiÄ™dzy procesami.
- Definicja procesu jest jednoczeÅ›nie dokumentacjÄ… logiki systemu – majÄ…c definicjÄ™ można wygenerować graficzny schemat procesu.
- NGinn pozwala używać ‘rules engine’ do zapisu drzew decyzyjnych w postaci reguÅ‚ if-then-else. Może siÄ™ to przydać tam gdzie istnieje potrzeba podejmowania różnych dziaÅ‚aÅ„ w oparciu o rozmaite atrybuty danych wejÅ›ciowych.
- W jasny sposób oddzielona jest infrastruktura NGinn od logiki biznesowej. Logika biznesowa jest przechowywana w definicji procesu w oparciu o którą infrastruktura ten proces realizuje.
Na koniec…
Podsumowując to wszystko, myślę że najefektywniejszą techniką tworzenia oprogramowania na zamówienie dla wymagających klientów (hm, czy są klienci niewymagający?) jest szybkie prototypowanie wsparte odpowiednio dostosowanym narzędziem. Pomaga to zarówno przy ustalaniu wymagań jak i przy późniejszej ich realizacji. Klientom bardzo przydaje się możliwość zobaczenia tego co chcą zamówić i skonfrontowania swoich wyobrażeń z rzeczywistością, a my dzięki temu mamy wymagania lepszej jakości i bardziej odpowiadające możliwościom systemu. No i szybciej możemy wystawić fakturę.
OczywiÅ›cie nie jest to jakieÅ› rewolucyjne podejÅ›cie – w Å›wiecie informatyki funkcjonujÄ… rozmaite metodyki prowadzenia projektów majÄ…ce w zaÅ‚ożeniach szybkie prototypowanie – na przykÅ‚ad Extreme Programming czy rozmaite Agile – ale zostawmy ten temat, w koÅ„cu nie zajmujemy siÄ™ tu teoriÄ… tylko robieniem softu. ReprezentujÄ™ punkt widzenia goÅ›cia który wÅ‚asnymi (lub zespoÅ‚u) rÄ™kami tworzy oprogramowanie  a wÅ‚asnÄ… gÅ‚owÄ… odpowiada za dostarczenie go klientowi zgodnie z zamówieniem i w terminie i mam nadziejÄ™ że takie spojrzenie od strony warsztatu jest dobrym uzupeÅ‚nieniem ‘best practices’ prowadzenia projektów informatycznych.