Odpowiedź DW jest świetna , ale chciałbym rozwinąć w jednym punkcie. Specyfikacja to nie tylko odniesienie, na podstawie którego weryfikowany jest kod. Jednym z powodów posiadania formalnej specyfikacji jest jej weryfikacja poprzez udowodnienie pewnych podstawowych właściwości. Oczywiście specyfikacji nie można całkowicie zweryfikować - walidacja byłaby tak złożona jak sama specyfikacja, więc byłby to niekończący się proces. Ale walidacja pozwala nam uzyskać silniejszą gwarancję niektórych krytycznych właściwości.
Załóżmy na przykład, że projektujesz autopilota samochodowego. Jest to dość złożona sprawa obejmująca wiele parametrów. Właściwości poprawności autopilota obejmują między innymi „samochód nie zderzy się ze ścianą” i „samochód będzie jechał tam, gdzie mu polecono”. Właściwość typu „samochód nie uderzy o ścianę” jest naprawdę bardzo ważna, dlatego chcielibyśmy to udowodnić. Ponieważ system działa w świecie fizycznym, musisz dodać pewne ograniczenia fizyczne; rzeczywista właściwość systemu obliczeniowego będzie przypominała „przy tych założeniach dotyczących materiałoznawstwa i tych założeniach dotyczących postrzegania przeszkód przez czujniki samochodu, samochód nie zderzy się o ścianę”. Ale mimo to wynik jest stosunkowo prostą właściwością, która jest wyraźnie pożądana.
Czy możesz udowodnić tę właściwość na podstawie kodu? Ostatecznie tak się dzieje, jeśli postępujesz zgodnie z całkowicie formalnym podejściem¹. Ale kod składa się z wielu różnych części; hamulce, kamery, silnik itp. są sterowane autonomicznie. Właściwość poprawności hamulców byłaby czymś w rodzaju „jeśli włączony jest sygnał„ włącz hamulce ”, wówczas hamulce zostaną uruchomione”. Właściwością poprawności silnika byłoby „jeśli sygnał sprzęgła jest wyłączony, wówczas silnik nie napędza kół”. Złożenie ich w całość zajmuje widok bardzo wysokiego poziomu. Specyfikacja tworzy warstwy pośrednie, w których różne elementy systemu mogą być połączone przegubowo.
W rzeczywistości tak złożony system, jak autopilot samochodowy, miałby kilka poziomów specyfikacji z różną ilością udoskonaleń. W projekcie często stosuje się podejście wyrafinowane: zacznij od niektórych właściwości wysokiego poziomu, takich jak „samochód nie zderzy się ze ścianą”, a następnie dowiedz się, że wymaga to czujników i hamulców, i opracuj podstawowe wymagania dotyczące czujników, hamulców i oprogramowanie pilotażowe, a następnie ponownie sprecyzuj te podstawowe wymagania w projekcie komponentu (w przypadku czujnika potrzebuję radaru, procesora DSP, biblioteki przetwarzania obrazu itp.) itp. W formalnym procesie opracowywania, udowodniono, że każdy poziom specyfikacji spełnia wymagania określone przez poziom nad nim, od właściwości najwyższego poziomu aż po kod.
Nie można być pewnym, że specyfikacja jest poprawna. Na przykład, jeśli źle zrozumiałeś fizykę, hamulce mogą nie być skuteczne, nawet jeśli matematyka odnosząca kod hamulca do wymagań formalnych jest poprawna. Nie jest dobrym dowodem na to, że przerwy są skuteczne przy 500 kg ładunku, jeśli faktycznie masz 5000 kg. Ale łatwiej jest zauważyć, że 500 kg jest błędne, niż zobaczyć w środku kodu hamulca, że nie będą one wystarczające dla fizycznych parametrów samochodu.
¹ Przeciwieństwem w pełni formalnego podejścia jest „Myślę, że to działa, ale nie jestem pewien”. Kiedy stawiasz na to swoje życie, nie wydaje się to takie wspaniałe.