Які бар'єри перешкоджають широкому застосуванню формальних методів? [зачинено]


14

Формальні методи можна використовувати для вказівки, доказування та генерації коду для програми. Це менш схильне до помилок - таким чином, здебільшого використовується в програмах безпеки / критичного значення.

Чому ми не використовуємо його частіше для повсякденного програмування, або у веб-додатках тощо ...?

Список літератури:


3
Ми могли б побудувати будинки з 5-футовими товщими стінами - як середньовічні замки. В більшості випадків це буде більше клопоту, ніж варто.
Балдрік

5
Ви можете спробувати застосувати формальні методи до проекту веб-розробників і подивитися, як це відбувається. Швидше за все, ви помітите, що ви вкладаєте багато зусиль у невисоку діяльність. На противагу цьому - швидке тестування на дим, яке вже захопить багато помилок. Цікаво, що системи статичного типу - це простий вид доказів, але особливо веб-розробка уникає цих мов (натомість віддаючи перевагу високодинамічним мовам, як Ruby, PHP чи JavaScript). Кореляція не передбачає причинного зв'язку, але дає паузу для роздумів.
амон

1
Отже, ви вважаєте за краще вказати мовою специфікації замість програмування мовою програмування? Гаразд, ви зможете довести, що він працює відповідно до специфікацій. Але як ви збираєтеся довести, що специфікація відображає справжню проблему?
Крістоф

3
@toto питання: робити речі правильно (працювати відповідно до специфікацій) або робити правильні речі (маючи хороші характеристики). Хоча в теорії специфікація - те, чого ми хочемо, на практиці ми рідко знаємо напевно, що насправді потрібно: beyssonmanagement.com/2012/10/29/…
Крістоф

3
Для тих, хто розчарований, що це закрито, зараз чудова публікація в блозі: Чому люди не використовують формальні методи?
icc97

Відповіді:


19

Інженер - це людина, яка може робити з доларом те, що може зробити будь-який ідіот з 10.

Обмеження ресурсами, бюджетні обмеження, часові обмеження, всі вони важливі.

Розробка програмного забезпечення з використанням формальних методів, як правило, значно дорожче і займає набагато більше часу, ніж без. Також для багатьох проектів найважче - розуміння вимог бізнесу. Все, що використання формальних методів купує вас у цьому випадку, є доказом того, що ваш код відповідає 100% вашому неповному та неправильному розумінню бізнес-вимог.

З цієї причини використання формальних методів, доказів, перевірки програм та подібних методів, як правило, обмежується "речами, що мають значення", тобто програмним забезпеченням авіоніки, системами управління медичним обладнанням, електростанціями тощо.


1
Я також додам, що введення формальних методів у мову програмування - це область активних досліджень на даний момент, тобто ще не готова до мейнстріму
jk.

1
Я приймаю цю відповідь, але я також хотів підходити до того, чому формальні методи все ще вважаються "дорогими" та "трудомісткими", особливо коли ми знаємо, наскільки дорого коштує обслуговування та відстеження / налагодження коду у великих проектах.
Тото

1
TDD & BDD - це підходи, побудовані на принципах логіки Хоара, фундамент формальних підходів. Вони підвищують ефективність, не заважаючи цьому.
Мартін Спамер

1
@toto Докази дійсно, дійсно важкі. Дуже багато речей, які математики сприймають як належне, не застосовуються до програм. Наприклад, в C ++, складання втрачає асоціативно (-1 + 1) + INT_MAX = INT_MAX, -1 + (1 + INT_MAX)не визначене поведінку.
Говеркуч

1
@toto: Причина, яку вони вважають "дорогою" і "забирає багато часу", полягає в тому, що ми можемо розглянути проекти, розроблені за допомогою формальних методів, і емпірично перевірити, що ці проекти потребують набагато більше часу. Подивіться, наприклад, час розробки seL4 / L4.перевірений, наприклад, порівняно з будь-якою іншою реалізацією L4.
Йорг W Міттаг

12

Програмувати чи не програмувати?

Щоб вирішити проблему з програмним продуктом, зрозумівши вимоги, ви можете НАВСЯК написати програму за допомогою мов програмування АБО вказати програму на формальній мові та використовувати засоби генерації коду. Останнє лише додає рівня абстракції.

Правильні речі чи правильні речі?

Офіційний підхід дає вам підтвердження того, що ваше програмне забезпечення працює відповідно до специфікацій. Тож ваш продукт робить все правильно. Але чи правильно це робить?

Вимоги, над якими ви працюєте, можуть бути неповними або неоднозначними. Вони навіть можуть бути баггі. У гіршому випадку реальні потреби навіть не виражені. Але малюнок вартує тисячі слів, просто зображення 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 менш затратні, ніж найвищий рівень сертифікації загальних критеріїв, але вони забезпечують значно більшу впевненість.


Контрактне програмування використовує хоча б неофіційні докази.
Френк Хілеман

@FrankHileman так! А простий факт роз’яснення передумов, постумов та інваріантів значно допомагає ефективно переглянути код, зменшити помилки та систематизувати тести.
Крістоф

На сьогодні це найкраща відповідь.
Хашим

0

Кожна програма будь-якою мовою може розглядатися як формальна специфікація (еквівалентна деякій токарній машині). Будь-яка «формальна специфікація» вищого рівня, яка повинна бути використана для доведення формальної коректності, також - лише інша програма. Але це (як правило) погана, неповна, розпливчаста, недостатньо продумана програма. І не випадково, як правило, це пишуть люди, які не знають, як програмувати (зазвичай це експерти в галузі домену).

І тому доказ того, що одна програма сумісна (дає однакові відповіді або як би ви її характеризували) з її формальними вимогами вищого рівня, незмінно зводиться до того, як ви вирішуєте неясності у формальній специфікації вищого рівня. Не існує хорошого загального призначення для цього.

Саме відображення вимог високого рівня до деталей нижчого рівня - це суть того, про що йдеться у реальному програмуванні. Не дивно, що основна робота програміста з читання та інтерпретації специфікацій не може бути замінена маханням рукою та кажучи "тепер просто подивіться, чи відповідає ця формальна специфікація високого рівня цією зразковою програмою".

Навіть у перші дні логічного програмування, де ця концепція вперше здавалася такою перспективною (оскільки як специфікація високого рівня, так і фактичні основні програми могли бути написані однією мовою), ця основна проблема виявилася непереборною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.