W kryształowej kuli
- Bogdan Bereza,
- 05.07.2004
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 czym 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 elastycznej 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.
Szybko, zwinnie, ekstremalnie
Słowa rapid, agile oraz extreme pojawiają się dziś wszędzie. Jaskrawym przykładem był wykład na konferencji EuroSTAR 2004 pt. Agile Inspections, co może się kojarzyć z "demokracją socjalistyczną": z definicji albo coś jest "zwinne", albo jest "inspekcją".
Podobnie jak Japończycy odkryli w latach 60. i 70., jak produkować to samo, co przemysł amerykański, tylko szybciej, elastyczniej i taniej, tak metody "zwinno-ekstremalne" usiłują znaleźć antidotum na wszelkie prawa Murphy'ego: rozrastanie się dokumentacji i zawiłych procedur, celebrowanie czynności, szukanie poczucia bezpieczeństwa w nadmiernie dokładnej analizie, niechęci do wystawiania się na ryzyko przez podejmowanie decyzji, dostarczanie kolejnych prototypów zamiast konkretnych produktów itd.
Wszystko to jest bardzo słuszne i należy mieć nadzieję, że te tendencje nie zanikną, lecz okrzepną i dojrzeją. Na przykład metodyka XP (eXtreme Programming) składa się dziś z całej serii bardzo dobrych metod, ale jednocześnie prozelici XP objawiają w swych publikacjach niemal religijne zacietrzewienie. Gdyby zastąpić tę nieco dziecinną zajadłość opisem sposobów, jak z korzyścią wdrażać wybrane elementy XP i jak dostosować poziom "ekstremalności" do wymogów produktu i projektu, zachowałoby się to, co w XP wartościowe, jednocześnie czyniąc metodykę łatwiejszą do zastosowania w praktyce. Tak więc znów powracamy do wcześniejszego wątku "metaprocesów": za 10 lat powinniśmy mieć do dyspozycji metaprocesy, pozwalające na wybór lub dostosowanie procesów wytwarzania do rodzaju produktu i wymagań projektu.
Języki programowania
"Język myślom kłamie" - w pewnym sensie niezmienne od 50. lat problemy programistów przypominają odwieczne kłopoty pisarzy i poetów - jak trafnie oddać za pomocą słów to, co gra w duszy, tak, by odbiorca trafnie rzecz zrozumiał?
Z programowaniem były i są trudności jeszcze większe niż z pisaniem wierszy: odbiorca (procesor) jest pozbawiony intuicji i jakichkolwiek informacji uzupełniających. Dlatego program sterujący jego działaniem musi być kompletny i jednoznaczny, nie zezwala na żadne luki i niejasności, na które możemy sobie pozwolić w słownej komunikacji z innymi ludźmi.
Z kolei programowanie jako działanie inżynierskie różni się od inżynierii "tradycyjnej" tym, że produkt jest niewidzialny, a jego funkcje nie dają się łatwo zilustrować planami czy schematami.
Z tymi problemami od dawna borykają się konstruktorzy języków programowania. Można tu wyróżnić kilka równoległych trendów.
Trudno w tym wszystkim znaleźć jakiś wyraźny trend, pozwalający przewidywać, jak potoczy się ewolucja języków programowania.