Програмувати чи не програмувати?
Щоб вирішити проблему з програмним продуктом, зрозумівши вимоги, ви можете НАВСЯК написати програму за допомогою мов програмування АБО вказати програму на формальній мові та використовувати засоби генерації коду. Останнє лише додає рівня абстракції.
Правильні речі чи правильні речі?
Офіційний підхід дає вам підтвердження того, що ваше програмне забезпечення працює відповідно до специфікацій. Тож ваш продукт робить все правильно. Але чи правильно це робить?
Вимоги, над якими ви працюєте, можуть бути неповними або неоднозначними. Вони навіть можуть бути баггі. У гіршому випадку реальні потреби навіть не виражені. Але малюнок вартує тисячі слів, просто зображення Google - "Що хоче клієнт", наприклад з цієї статті :
Вартість формальності
У досконалому світі ви мали б повністю деталізовані та досконалі вимоги з самого початку. Потім ви зможете повністю вказати своє програмне забезпечення. Якщо ви підете на офіційний, ваш код буде генеруватися автоматично, щоб ви були більш продуктивними. Підвищення продуктивності компенсувало б вартість формальних інструментів. І всі зараз використовували б формальні методи. То чому ж це не так?
На практиці це рідко є реальністю! Ось чому стільки проектів водоспадів не вдалося, і чому ітеративні методи розробки (спритний, RAD тощо) взяли на себе ініціативу: вони можуть впоратися з неповними та недосконалими вимогами, розробками та реалізаціями та вдосконалити їх до тих пір, поки вони не стануть нормальними.
І ось тут справа. При формальних методах кожна ітерація вимагає мати повністю послідовну формальну специфікацію. Це вимагає ретельного мислення та додаткової роботи, оскільки формальна логіка не прощає і не любить неповні думки. Прості експерименти з викиданням стають дорогими при цьому обмеженні. І так само кожна ітерація, яка б призвела до зворотного відстеження (наприклад, ідея, яка не працювала, або вимога, яку не зрозуміли).
На практиці
Якщо не зобов’язані використовувати формальні методи з юридичних чи договірних причин, ви також можете досягти дуже високої якості без формальних систем, наприклад, використовуючи програмування на основі контрактів та інші належні практики (наприклад, перегляд коду, TDD тощо). Ви не зможете довести, що ваше програмне забезпечення працює, але ваші користувачі швидше насолоджуються робочим програмним забезпеченням.
Оновлення: розмірене зусилля
У жовтневому випуску « Комунікації ОСБ» за жовтень 2018 року є цікава стаття про формально перевірене програмне забезпечення в реальному світі з деякими оцінками зусиль.
Цікаво (на основі розробки ОС для військової техніки) здається, що виготовлення офіційно перевіреного програмного забезпечення вимагає в 3,3 рази більше зусиль, ніж для традиційних інженерних методів. Тож це дійсно дорого.
З іншого боку, для отримання програмного забезпечення підвищеної безпеки таким чином потрібно в 2,3 рази менше, ніж для традиційно розробленого програмного забезпечення, якщо додати зусиль, щоб таке програмне забезпечення було сертифіковано на високому рівні безпеки (EAL 7). Тож якщо у вас високі вимоги щодо надійності чи безпеки, то, безумовно, діловий випадок має бути офіційним.
Дизайн та розробка коду seL4 зайняли два людино-роки. Якщо додати всі сероспецифічні докази за ці роки, загалом вийшло 18 осіб-років за 8700 рядків коду С. Для порівняння, L4Ka :: Фісташка, ще один мікроядр із сімейства L4, порівнянний за розміром з seL4, знадобився шість людино-років, і він не забезпечує значного рівня впевненості. Це означає, що між перевіреним програмним забезпеченням та традиційно розробленим програмним забезпеченням існує лише коефіцієнт 3.3 . Відповідно до методу оцінки Колберта та Бома, 8 традиційна сертифікація загальних критеріїв EAL7 для 8 700 рядків коду С потребує понад 45,9 осіб-років. Це означає, що формальна перевірка впровадження двійкового рівня вже перевищує коефіцієнт 2,3 менш затратні, ніж найвищий рівень сертифікації загальних критеріїв, але вони забезпечують значно більшу впевненість.