Programować czy nie programować?
Aby rozwiązać problem z oprogramowaniem, po zapoznaniu się z wymaganiami możesz EITHER napisać program przy użyciu języków programowania LUB określić program przy użyciu języka formalnego i użyć narzędzi do generowania kodu. Ten ostatni dodaje poziom abstrakcji.
Czy robisz to dobrze, czy robisz dobrze?
Podejście formalne daje dowód, że oprogramowanie działa zgodnie ze specyfikacjami. Twój produkt robi to dobrze. Ale czy robi to dobrze?
Wymagania, nad którymi pracujesz, mogą być niepełne lub niejednoznaczne. Mogą nawet mieć problemy. W najgorszym przypadku rzeczywiste potrzeby nie są nawet wyrażone. Ale zdjęcie jest warte tysiąca słów, wystarczy użyć obrazów Google dla „Czego chce klient”, na przykład z tego artykułu :
Koszt formalności
W idealnym świecie od samego początku miałbyś w pełni szczegółowe i idealne wymagania. Następnie możesz w pełni określić swoje oprogramowanie. Jeśli zdecydujesz się na formalny, kod zostanie wygenerowany automatycznie, dzięki czemu będziesz bardziej produktywny. Wzrost wydajności zrównoważyłby koszty narzędzi formalnych. I wszyscy teraz używaliby metod formalnych. Dlaczego więc nie jest?
W praktyce rzadko jest to rzeczywistością! Właśnie dlatego tak wiele projektów wodospadu nie powiodło się i dlaczego wiodące były metody iteracyjne (zwinne, RAD itp.): Potrafią poradzić sobie z niekompletnymi i niedoskonałymi wymaganiami, projektami i implementacjami oraz dopracować je, dopóki nie będą w porządku.
I tu chodzi o sedno. W przypadku metod formalnych każda iteracja wymaga posiadania całkowicie spójnej specyfikacji formalnej. Wymaga to starannego myślenia i dodatkowej pracy, ponieważ logika formalna nie wybacza i nie lubi niekompletnych myśli. Proste eksperymenty z wyrzucaniem stają się kosztowne pod tym ograniczeniem. Podobnie dzieje się z każdą iteracją, która doprowadziłaby do wycofania się (np. Pomysł, który nie zadziałał lub wymaganie, które zostało źle zrozumiane).
W praktyce
Gdy nie jest się zobowiązanym do korzystania z metod formalnych z przyczyn prawnych lub umownych, można również osiągnąć bardzo wysoką jakość bez formalnych systemów, na przykład stosując programowanie oparte na umowie i inne dobre praktyki (np. Przegląd kodu, TDD itp.). Nie będziesz w stanie udowodnić, że twoje oprogramowanie działa, ale Twoi użytkownicy będą mogli cieszyć się działającym oprogramowaniem wcześniej.
Aktualizacja: zmierzony wysiłek
W wydanym w październiku 2018 r. Wydaniu Communications of ACM znajduje się interesujący artykuł na temat formalnie zweryfikowanego oprogramowania w świecie rzeczywistym, zawierający niektóre szacunki nakładu pracy.
Co ciekawe (w oparciu o rozwój systemu operacyjnego dla sprzętu wojskowego) wydaje się, że formalnie udowodnione oprogramowanie wymaga 3,3 razy więcej wysiłku niż w przypadku tradycyjnych technik inżynieryjnych. To jest naprawdę kosztowne.
Z drugiej strony, uzyskanie 2,3 razy mniejszego wysiłku, aby uzyskać oprogramowanie o wysokim bezpieczeństwie w ten sposób niż w przypadku tradycyjnie opracowanego oprogramowania, jeśli dodasz wysiłek, aby takie oprogramowanie było certyfikowane na wysokim poziomie bezpieczeństwa (EAL 7). Tak więc, jeśli masz wysokie wymagania dotyczące niezawodności lub bezpieczeństwa, to zdecydowanie jest uzasadnienie biznesowe do formalnego.
Projekt i opracowanie kodu seL4 zajęło dwie osoby na lata. Zsumowanie wszystkich dowodów serospecyficznych na przestrzeni lat daje w sumie 18 osobolat dla 8700 linii kodu C. Dla porównania, opracowanie L4Ka :: Pistachio, kolejnego mikrojądra w rodzinie L4, porównywalnego pod względem wielkości z seL4, zajęło sześć osobolat, i nie zapewnia znaczącego poziomu pewności. Oznacza to, że istnieje tylko współczynnik 3.3 między zweryfikowanym oprogramowaniem a tradycyjnie opracowanym oprogramowaniem. Według metody szacowania Colberta i Boehm'a 8, tradycyjna certyfikacja Common Criteria EAL7 dla 8700 linii kodu C zajęłaby ponad 45,9 osobolat. Oznacza to, że formalna weryfikacja implementacji na poziomie binarnym jest już ponad 2,3 mniej kosztowne niż najwyższy poziom certyfikacji Common Criteria, ale zapewnia znacznie lepszą pewność.