Відповідь DW чудова , але я хотів би розширитись на одну точку. Специфікація - це не просто посилання, на яке перевіряється код. Однією з причин мати офіційну специфікацію є підтвердження її шляхом доведення деяких основних властивостей. Звичайно, специфікація не може бути повністю підтверджена - перевірка була б такою ж складною, як і сама специфікація, тому це був би нескінченний процес. Але валідація дозволяє отримати більш гарантію щодо деяких критичних властивостей.
Наприклад, припустимо, що ви проектуєте автомобільний пілот. Це досить складна річ, що включає безліч параметрів. Властивості правильності автопілота включають такі речі, як "автомобіль не вріжеться в стіну" та "автомобіль їде туди, куди йому сказано їхати". Властивість на кшталт "автомобіль не вріжеться в стіну" насправді важлива, тому ми хотіли б це довести. Оскільки система працює у фізичному світі, вам потрібно буде додати деякі фізичні обмеження; фактична властивість обчислювальної системи буде чимось на кшталт «за цими припущеннями щодо матеріалознавства, і за цими припущеннями щодо сприйняття перешкод датчиками машини автомобіль не вріжеться в стіну». Але навіть так, результат є відносно простою властивістю, явно бажаною.
Не могли б ви довести цю властивість з коду? Зрештою, ось що відбувається, якщо ви дотримуєтесь повністю формального підходу¹. Але код має багато різних частин; гальма, камери, двигун тощо керуються автономно. Властивість коректності гальм буде чимось на кшталт "якщо сигнал" застосувати гальмо "увімкнено, тоді гальма застосовуються". Властивістю правильності двигуна було б "якщо сигнал зчеплення вимкнено, то двигун не веде колеса". Потрібно дуже високого рівня, щоб зібрати їх разом. Специфікація створює проміжні шари, де різні компоненти системи можуть бути зчленовані разом.
Насправді така складна система, як автопілот автомобіля, мала б декілька рівнів технічних характеристик з різною кількістю доопрацювань. У дизайні часто використовується підхід до вдосконалення: почніть з властивостей високого рівня, таких як "автомобіль не вріжеться в стіну", а потім з’ясуйте, що для цього потрібні датчики і гальмо, і розробіть деякі основні вимоги до датчиків, гальм. і пілотне програмне забезпечення, а потім ще раз уточнити ці основні вимоги до дизайну компонента (для датчика мені знадобиться радар, DSP, бібліотека обробки зображень ...) тощо. У формальному процесі розробки, доведено, що кожен рівень специфікацій відповідає вимогам, встановленим рівнем над ним, від властивостей найвищого рівня до коду.
Неможливо бути впевненим, що специфікація правильна. Наприклад, якщо ви помилилися з фізикою, гальма можуть бути неефективними, навіть якщо математика, що стосується гальмівного коду, до формальних вимог, є правильною. Недоцільно доводити, що перерви ефективні при 500 кг вантажу, якщо у вас є 5000 кг. Але простіше зрозуміти, що 500кг помиляється, ніж бачити у гальмівному коді, що вони не будуть достатньо хорошими для фізичних параметрів автомобіля.
¹ Протилежним до формального підходу є "Я думаю, що це працює, але я не можу бути впевнений". Коли ви ставите на це своє життя, це не здається великим.