W kryształowej kuli: inżynieria oprogramowania

Transkrypt

W kryształowej kuli: inżynieria oprogramowania
© NewQuality
W kryształowej kuli: inżynieria oprogramowania
za 10 lat
Typowe błędy przewidywania
Próby przewidywania, jak będzie wyglądać niedaleka choćby przyszłość, zawsze
pociągały ludzi – i często kończyły się niepowodzeniem. Lektura literatury sciencefiction, nawet ambitnej, sprzed lat kilkudziesięciu, zwykle pobudza do śmiechu:
nawet u znakomitego i chwilami rzeczywiście proroczego Lema wielkie kalkulatory
zwykle migają licznymi światełkami, wypluwają z siebie mnóstwo dziurkowanej taśmy
i nerwowo potrząsają cyframi w okienkach.
Próby kształtowania rzeczywistości, od względnie niewinnych, jak państwowe
wsparcie dla przyszłościowych gałęzi przemysłu lub dziedzin nauki, po złowieszcze,
jak socjalizm i komunizm, regularnie kończą się spektakularnymi niepowodzeniami.
Jednocześnie wszelka ludzka działalność wymaga przewidywania przyszłego stanu
rzeczy. Każda decyzja inwestycyjna w przedsiębiorstwie, każde podjęcie lub
zaniechanie projektu opiera się de facto na przewidywanych skutkach takiego
działania. Toteż zabierając się do przewidywania, warto uzmysłowić sobie, jakie są
typowe błędy, które popełniamy, aby móc próbować ich unikać.
•
•
•
Pośpieszne wnioskowanie bez wstępnej analizy obecnej sytuacji; przykładem
jest np. pośpieszne wyciąganie wniosków o istnieniu zależności przyczynowej, gdy
mamy jedynie do czynienia z korelacją, lub o istnieniu korelacji, gdy mamy do
czynienia jedynie z przypadkowym współwystąpieniem pewnych zjawisk.
Nie umiemy przewidzieć skutków ubocznych – zwłaszcza odległych w czasie –
podjętych działań. Typowe przykłady to rozmaite próby inżynierii społecznej,
interwencji gospodarczych państwa oraz interwencji w systemy biologiczne: z
reguły zacne intencje działań przynoszą niezaplanowane skutki, bardzo odległe od
zamierzonych.
Błędne oszacowania prawdopodobieństwa przyszłych wydarzeń. Istnieje wiele
poznanych zależności, np. rozmaite zjawiska (wzorce, struktury w czasie i w
przestrzeni) regularne wydają się bardziej prawdopodobne niż nieregularne.
Szczególne znaczenie dla trafności przewidywania przyszłości ma zjawisko
poszukiwania logicznej historii: zdarzenia, łączące się w zgodny z doświadczeniem
życiowym łańcuch związków przyczynowo-skutkowych wydają się
prawdopodobniejsze od zdarzeń, gdzie takich związków nie dostrzegamy.
Strona 1 (4)
© NewQuality
•
Ekstrapolacja liniowa:
przewidywany
dalszy przebieg
zjawisko
faktyczny
dalszy przebieg
dotychczasowy
przebieg
czas
Ilustracja 1 Przykłady błędów ludzkiego przewidywania
Uzbrojeni w tego rodzaju ostrzeżenia (psychologia poznawcza ma na ten temat wiele
danych, z których tutaj skrótowo podanych zostało zaledwie kilka przykładów),
przystępujemy do próby opisu, co może się zmienić w ciągu najbliższych 10-ciu lat.
Szybko i intuicyjnie
O ile wiele dzisiejszych tendencji zdaje się prowadzić w kierunku bardziej
uporządkowanych i sformalizowanych metod projektowania systemów, o tyle
zjawiska opisane poniżej są wyrazem dążeń diametralnie przeciwnych: tworzenia
systemów w sposób spontaniczny, intuicyjny, pozbawiony gorsetu sztywnych
metodyk i – zdaniem zwolenników – dzięki temu pozwalający na pokonanie trzech
chronicznych bolączek inżynierii oprogramowania:
•
•
•
Niedostosowania języka specyfikacji systemu przez programistów do języka
użytkowników;
Trudności z uwzględnieniem i wdrożeniem późnych zmian wymagań i zakresu;
Marnotrawstwa pracy na tworzenie licznych artefaktów pośrednich:
dokumentacji, specyfikacji, modeli, raportów.
Można oczekiwać, że w przyszłości pojawi się metodyka (by nie powiedzieć: nauka),
pozwalająca precyzyjnie dopasować zastosowany proces wytwarzania do rodzaju
produktu, wymagań projektowych i jakościowych. Dziś wybór między zastosowaniem
procesu ciężkiego a procesu lekkiego dokonywany jest zwykle albo na podstawie
mętnych intuicji, albo firmowej tradycji i kultury. W przyszłości pojawią się, miejmy
nadzieję, metody (można je nazwać meta-procesami), pozwalające trafniej
dopasować poziom formalizacji procesu wytwarzania do wymagań.
Strona 2 (4)
© NewQuality
Programowanie intencjonalne
Jeden z najnowszych pomysłów to programowanie intencjonalne. Programista nie
pisałby kodu, tylko generator programów, produkujący kod na podstawie opisu
intencji (stąd nazwa) eksperta domenowego, wyrażonych mieszanką języka
naturalnego i różnych form wizualizacji (rysunki, wykresy, diagramy).
O ile faktyczna realizacja takiego pomysłu wymagałaby bez wątpienia zastosowania
najnowszych technologii i metodyk, o tyle sama koncepcja jest w zasadzie prostą
ekstrapolacją tego, co widzieliśmy w rozwoju inżynierii oprogramowania już
wielokrotnie:
•
•
•
Piętrowej architektury systemów realizowanej poprzez hierarchię maszyn
wirtualnych: nie pisze się dzisiaj aplikacji działających wprost na procesorze i
innych urządzeniach sprzętowych, lecz na wirtualnych platformach: sterownikach,
systemie operacyjnym, API, bibliotekach łączonych statycznie i dynamicznie,
wreszcie gotowych komponentach.
Języki 4-ej generacji: opis na wysokim poziomie abstrakcji przetwarzany
automatycznie na kod źródłowy programu.
Modelowanie: języki o składni uwzględniającej potrzeby domenowe służą do
modelowania (UML, XML, SDL), po czym rozmaite techniki – lub wręcz programy
tłumaczące – wspierają przełożenie modelu na kod nadający się do kompilacji i
wykonania.
Nie wydaje się, aby ten kierunek – choć na pewno ciekawy i mogący zaowocować
wieloma cząstkowymi rozwiązaniami – uporał się z kluczowymi problemami inżynierii
oprogramowania. Co najmniej 1/3 kłopotów w projektach informatycznych bierze się
nie z błędów implementacji, lecz z błędnych, niespójnych lub niekompletnych
wymagań, czemu żadne generatory kodu z intencji zapobiec nie potrafią.
Pomogłyby natomiast nowe, skuteczniejsze sposoby opisu i modelowania ludzkich
czynności oraz procesów – to temat do kolejnej książki.
Testowanie eksploracyjne
Jak proces projektowania i implementacji ma zwolenników metodyk intuicyjnych, tak
i testowanie próbuje uporać się z dylematem braku dokumentacji i specyfikacji
metodami zwanymi eksploracyjnymi. Testowanie eksploracyjne oznacza próbę
jednoczesnego badania funkcjonalności aplikacji, analizę wsteczną tego, jak powinna
działać i wreszcie testowania, czy działa poprawnie.
Sądzę, że wiele technik testowania eksploracyjnego ma przed sobą przyszłość.
Testowanie daje się zrealizować technikami formalnymi, algorytmicznymi, tylko w
pewnym zakresie – poza tym czynnikami sukcesu w testowaniu jest intuicja, twórczo
Strona 3 (4)
© NewQuality
spożytkowane doświadczenie, umiejętność myślenia. Natomiast cała ideologia
testowania eksploracyjnego: traktowanie planów i specyfikacji testów jako zbędnego
balastu nawet dla dobrze udokumentowanych systemów – pozostanie zapewne
jedną z wielu zabawnych, przemijających ciekawostek.
Spirale, iteracje, przyrost
Tradycyjne metody wytwarzania oprogramowania, dobrze zilustrowane modelem
kaskadowym i (pojedynczym) modelem „V”, nie radziły sobie z projektami zbyt
wielkimi, ani ze zmiennością wymagań, ani z koniecznością bardzo szybkich dostaw
choćby zrębów nowej funkcjonalności.
Stąd pojawiły się różne metodyki (spiralna, iteracyjna, przyrostowa – przy czy
określenia te nie są ani precyzyjne, ani rozłączne), pozwalające budować systemy i
aplikacje niejako po kawałku. Wprawdzie sprawiają one wiele kłopotów (komplikują
organizację projektów, narzucają konieczność rozbudowanych testów regresji, czyli
wielokrotnego ponownego testowania funkcji już przetestowanych), ale pozwalają
skuteczniej niż metodyki tradycyjne wykorzystać elastyczność materii
oprogramowania, która – pod warunkiem stworzenia odpowiednio giętkiej
architektury – pozwala majstrować przy fundamentach nawet wtedy, gdy na górze
położony jest już dach.
Metodyki przyrostowe pozostaną i rozpowszechni się ich zastosowanie. Zapewne
zaczną pojawiać się narzędzia, ułatwiające dobór odpowiedniej metodyki do założeń
projektowych, oraz narzędzia wspierające przekład wymagań (opisanych w formie
modelu) na architekturę tak, by architektura wspierała przyrostową organizację
projektu. Nie można wykluczyć, że pewne narzędzia umożliwią automatyczne
generowanie zarysu wstępnej organizacji projektu na podstawie wymagań
dotyczących produktu.
Strona 4 (4)