Чи можливо досягти абсолютного нульового стану помилки для великомасштабного програмного забезпечення?


71

Я кажу про 20-30 + мільйони рядків коду, програмне забезпечення в масштабі та складності Autodesk Maya, наприклад.

Якщо ви заморозите розробку стільки часу, скільки вона повинна бути, чи зможете ви виправити всі помилки, доки просто не з’явиться жодна помилка, якщо таке можна перевірити комп'ютерами? Які аргументи проти і проти існування системи без помилок?

Тому що існує думка, що кожне виправлення, яке ви робите, створює більше помилок, але я не думаю, що це правда.

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


11
"мені сказали кілька топ-програмістів" - вони мені не схожі на топ-програмістів. Вони звучать як топ-хакери. Однією з ОСНОВНИХ ВІДПОВІДАЛЬНОСТІ програміста є розуміння того, що робить їх код та як він впливає на систему в цілому. Ось чому ми маємо TDD, схеми дизайну тощо. Якщо цього неможливо зробити, система є непотрібним - процес розробки проходив хаотично, випадково, недисципліновано, ненауково.
Вектор

51
Якщо ви ще не знаєте, що помилка ще існує, це все-таки помилка?
Blrfl

5
@Blrf: Що ще важливіше, якщо кінцевий користувач не знає про помилку, чи існує вона?
mattnz

40
«Існує два способи побудови дизайну програмного забезпечення. Один із способів - зробити це настільки простим, що явно немає недоліків. А інший спосіб - це зробити його таким складним, що явних недоліків немає. "- ЗКД Хоар
Ендрю Льюїс

5
Так, але багато людей не хочуть, щоб їх основоположні переконання ставились під сумнів.
Джоан Венге

Відповіді:


92

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

Ключовим моментом є те, що ви значно недооцінюєте складність програмного забезпечення.

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

Існування бібліотек робить це більш складним. Хоча операційні системи, як правило, досить стабільні, бібліотеки - це змішаний пакет, коли справа доходить до стабільності. Деякі чудові. Інші ... не так вже й багато ... Якщо ви хочете, щоб ваш код був на 100% вільним помилок, вам також потрібно буде забезпечити, щоб кожна бібліотека, проти якої ви працюєте, була повністю вільною від помилок, і багато разів це просто неможливо, оскільки у вас може не бути вихідного коду.

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

Речі йдуть від важкого до неможливого, коли ми дивимось на саму машину. Процесори не є ідеальними. Оперативна пам’ять не є ідеальною. Жорсткі диски не ідеальні. Жоден з компонентів всередині машини не розроблений так, щоб бути ідеальним - вони розроблені таким чином, щоб вони були "досить хорошими". Навіть досконала програма в кінцевому підсумку вийде з ладу через гикавку машиною. Ви нічого не можете зробити, щоб зупинити це.

Підсумок: Ви можете написати "Програмне забезпечення безкоштовного програмного забезпечення"?

НЕМАЄ

Кожен, хто вам скаже інакше, не знає.

Просто спробуйте написати програмне забезпечення, яке легко зрозуміти та підтримувати. Щойно ви зробите це, ви можете називати це за день.


EDIT: Деякі люди коментували чудовий момент, який я зовсім не помітив: компілятор.

Якщо ви не пишете на зборах, цілком можливо, що компілятор зіпсує ваш код (навіть якщо ви докажете, що ваш код "ідеальний").

Список помилок у GCC, одному з найбільш часто використовуваних компіляторів: http://gcc.gnu.org/bugzilla/buglist.cgi?product=gcc&component=c%2B%2B&resolution=---


8
Відповідь все ще "ні", тому що завжди знайдуться "помилки", де щось працює - просто не так, як замовник чи власник продукту хотів би, щоб це працювало. Деякі з нас можуть зателефонувати на ці запити щодо функцій або просити змінити поведінку або додати функціональність, але людині, яку щодня дратують якісь «помилки», те, що їх дратує, - це помилка. (Це довгий шлях, коли можна сказати, що деякі помилки потрапляють в очі того, хто дивиться.) КУПИТЕ БЕЗКОШТОВНО КОД неможливо. Націліться на код, який достатньо хороший, щоб відповідати своєму призначенню.
quick_now

6
Я піду на крок далі: код може мати приховані дефекти, наприклад, у вас може бути код, який не належним чином перевіряє вхід. Якщо вхід з якоїсь щасливої ​​причини ніколи не виходить за межі, помилка ніколи не проявляється. Потім одного дня під час технічного обслуговування або зміни функції цей фрагмент коду викликається з іншого місця, який НЕ періодично виконує його із значенням поза діапазоном. Тепер клоп проявляється - але він був там весь час. Ви можете мати ступінь божевілля у всьому цьому - але усунення кожної можливості помилки все ще неможливо.
quick_now

11
@ JohnR.Strohm Я не впевнений, чому ви вважаєте, що програма «модулятор потоку повідомлень», програма з 556 рядками коду, має щось із питання щодо теоретичної системи 20 мільйонів ліній. Якщо, мабуть, продемонструвати, що як би важко було довести правильність крихітної програми, було б астрономічно важче довести правильність масивної програми.
Ерік Кінг

9
Хоча в первинному питанні цього не було, я хотів би зазначити, що між "теоретично можливим" і "практично можливим" існує величезна різниця. Незважаючи на те, що базова кодова база з 20 мільйонами рядків теоретично можлива, це майже напевно практична неможливість на сучасному ринку. Хто знає, що перед собою майбутнє.
Ерік Кінг

4
@ JohnR.Strohm Ви повинні прочитати статтю уважніше. Вони кажуть самі: It is important to note, however, that even all of these steps provide no guarantee of absolute security. It is tempting to believe that a formally specified and proved program should be absolutely correct, but there are several reasons why a proved program may not behave exactly as expected.- значить, це не може бути доведено, що немає помилок, а, швидше, менше шансів на помилки. Швидше як TDD.
Ізката

27

Математично МОЖЕ бути можливим писати програмне забезпечення «без проблем» такої складності, залежно від того, як ви визначаєте «помилку». Довести це МОЖЛИВО і математично можливо, створивши тестову систему, яка реалізовувала б кожен рядок коду всіма можливими способами - у кожному можливому випадку використання. Але я не впевнений - якщо ви маєте справу з системою, яка робить складні обчислення, ви можете зіткнутися з "проблемою нескінченності" ...

Практично кажучи, в системі розміру та обсягу, про який ви говорите, це НЕМОЖЛИВО . На написання такої системи «помилок» може знадобитися 1000 років, а для того, щоб довести, що це доведеться, це займе експоненціально більше часу: вам доведеться придумати всі можливі випадки використання і написати систему, яка перевірятиме кожну одне - і я не вірю, що існує спосіб визначити, що ви фактично висвітлювали кожен випадок використання в системі розміру та обсягу, про який ви говорите, у чомусь схожому на розумну кількість часу.

ІМО ваше запитання дещо неправильно: наша мета як розробників - не писати програмне забезпечення, що не відповідає проблемі. Нашою метою є написання програм USABLE, FLEXIBLE, EASILY MAINTAINABLE .

Придатна для використання система: відповідає головним вимогам, для яких вона була розроблена. Можуть бути помилки - але вони будуть у «крайових випадках» - екслідери чи роздратування, а не помилки, що компрометують основи системи - надійні.

Технічне обслуговування: помилок можна легко виділити та виправити, і НЕ створювати нових помилок.

Гнучкість: Вашу систему легко змінювати та розширювати без значного перепроектування та простоїв: Більшість змін вимагають просто додати новий клас або модуль, який відповідає вашим уже добре розробленим шаблонам і рамкам.

Хороша практика дизайну, хороша практика управління, хороша робота в команді, сумлінні розробники - ось формула ДОБРОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ . (не досконало - але ДОБРО )


3
"Довести це МОЖЛИВО також математично можливо, розробивши тестову систему, яка би використовувала кожен рядок коду всіма можливими способами - усіма можливими випадками використання.": Такої програми взагалі не існує (і це можна довести!). Тож загального алгоритму доведення правильності не існує.
Джорджіо

3
Виправлення: програмне забезпечення без помилок, ЗАВЕРШЕННЯ ФОРМАЛЬНОГО МАТЕМАТИЧНОГО ДОКАЗУВАННЯ КОРЕКТНОСТІ, досягнуто. Це було зроблено в 1982 році. Google "модулятор потоку повідомлень".
Джон Р. Стром

6
@ JohnR.Strohm: Неправда. Ось лише одна цитата - є кілька робіт і декілька місць, де вони стосуються подібних проблем: "Питання, яке часто виникає, -" Ви перевірили верифікатор? "Можливо, дивно, що це метаматематичне запитання часто задають інженери не просто точковим керівником. Звичайно, якщо машина коли-небудь відповість на запитання "Ти коли-небудь брешеш?", відповідь буде не більш інформативною, ніж коли людина відповість на питання ".
Вектор

1
Я мав на увазі, що немає загального алгоритму, який би працював для будь-якої програми введення та будь-якої специфікації введення. Ви можете вирішувати лише конкретні випадки (наприклад, ваш приклад).
Джорджіо

1
@Giorgio - отже, IMO, дотримуватися належних дизайнерських практик набагато важливіше, ніж стосуватися себе математичної коректності: спроектуйте свій код, щоб він міг бути добре інтегрований та сумісний із тим, що вже є - і є достатньо надійним, щоб легко впоратися з дефектами, коли вони з'являються на світ (що вони будуть).
Вектор

27

Згідно з цією статтею, бортове програмне забезпечення для космічного човника підійшло дуже близько - в останніх трьох версіях лінійної програми на 420 000 було лише одна помилка. Програмне забезпечення підтримувалося групою з 260 чоловіків і жінок. Велика кількість цих людей були верифікаторами, єдиною метою яких було виявити помилки.

Оновлення програмного забезпечення, яке дозволило човнику рухатись із супутників глобального позиціонування, вплинуло лише на 1,5% програми, або 6,366 рядків коду. Характеристики цієї зміни змінили 2500 сторінок. Технічні характеристики для загальної програми заповнили 30 томів і налічували 40 000 сторінок, або в середньому десять рядків коду на сторінку специфікації.

Бюджет не був проблемою - 35 мільйонів доларів на рік вони могли дозволити собі робити все правильно.


25
Одна виявлена помилка кожного. Хто знає, скільки виявлених помилок? :)
Андрес Ф.

8
Та "одна помилка" була особливим випадком. Спочатку човник був розроблений, а програмне забезпечення вказане, для двох роботів. "Помилка" полягала в тому, що там ще був код для підтримки другої руки.
Джон Р. Стром

4
+1 Пробіг без помилок у 135 місіях з 1981 по 2011 рік
MarkJ

5
@MarkJ: ми, мабуть, не знатимемо, чи насправді космічний човник не мав помилок. Кожні місії космічного шатла постійно, суворо контролюються сотнями людей, і будь-які помилки в кодуванні були б виправлені / усунені вручну.
Лежи Райан

2
@LieRyan Яка чудово демонструє одне велике властивість надійних систем - якщо вони не виходять з ладу і завжди дозволяють налаштувати ручне налаштування, ви можете замість цього використати надлишкові системи (такі, як у контрольному центрі). Звичайно, це має сенс лише в тому випадку, якщо у вас є такі зайві системи, і якщо ви справді можете забезпечити правильність та послідовність. У типовому бізнес-додатку крах часто буде віддати перевагу роботі в непослідовному стані - це різниця між роздратуванням і, скажімо, відправленням грошей невірному хлопцеві. Або отримувати гроші, не надсилаючи їх ...
Луаан

15

По суті, ні, але ви все одно повинні робити все можливе. Я поясню, чому (або просто перейти до висновку, якщо у вас недостатньо терпіння)

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

Скільки помилок ми можемо очікувати у величезній програмі? Я знайшов одне число «10 дефектів на 1000 рядків» (Code Complete 2nd edition, стор. 517 - просто використано приклад, не цитуючи жодних даних). Це дає нам близько 200 000 до 300 000 помилок у вашому програмному забезпеченні. На щастя, у нас є способи покращити якість програми. Як відомо, одиничне тестування, огляд коду та звичайне ручне тестування дозволяють зменшити кількість помилок. І все-таки кількість все ще буде високою.

Якби ми могли вирішити 95% всіх помилок, це було б неймовірно. І все ж у нас все ще буде від 10 000 до 15 000 помилок у програмному забезпеченні.

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

Ви також, здається, помилково припускаєте, що якщо програмне забезпечення не зміниться, нові помилки не з’являться. Якщо програмне забезпечення залежить від сторонніх бібліотек, нові версії можуть порушити деякі функції - введення нових помилок, хоча код програми все-таки той самий. Нові операційні системи також можуть зламати додаток, який раніше працював ідеально (популярний приклад див. У Windows Vista). Розглянемо також помилки компілятора тощо.

Незрозуміло, чи справді інструменти для підтвердження коду можуть вирішити проблему програмного забезпечення. Звичайно, неможливо вирішити проблему зупинки для будь-якої програми, але можна довести, що програма веде себе як зазначено ... Але що тоді? Можливо, у програмі підтвердження є помилка. Можливо, у самій специфікації є помилка.

Очевидно, що ми можемо значно зменшити кількість помилок, але насправді навряд чи ми досягнемо нуля.

Тому що існує думка, що кожне виправлення, яке ви робите, створює більше помилок, але я не думаю, що це правда.

(наголос додано)

Ви праві. Це твердження неправильне. Ось приклад:

int main() {
    int x[10];
    x[10] = 8; //Buffer overflow here
    return 0;
}

Тепер давайте виправити цю помилку:

int main() {
    int x[11];
    x[10] = 8; //No buffer overflow here
    return 0;
}

Побачити? Ми виправили помилку і не ввели нових.

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

Скажімо, що на кожні 100 помилок, які я виправляю, я випадково ввожу новий. Тому якщо я виправляю 10 000 помилок, я ввожу 100 нових помилок. І якщо я виправляю ці нові помилки, я ввожу одну помилку. Але так що? Зараз у програмі на 9 999 менше помилок, тож це, мабуть, краще, ніж це було (якщо припустити, що ця помилка не в 10 000 разів гірша за попередню).

Також виправлення помилки може викрити нові. Але ці помилки також можна виправити. Якщо ви все зробите правильно, з часом програмне забезпечення буде в кращому стані, ніж було запущено.

Я був старшим кількома топ-програмістами, що краще не виправляти багато помилок через поняття, яке я згадував в ОП.

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

Так менше помилок виправляєте, тим менше помилок повернеться до вас у майбутньому

Чим менше помилок виправите, тим більше помилок залишиться у вашому програмному забезпеченні, дратуючи користувачів. Дійсно, вони не "повернуться до вас у майбутньому". Вони не повернуться, тому що ніколи не виїжджали в першу чергу. Поняття "повернутися" пов'язане з регресіями. Знову ж таки, можна зменшити ризик регресії.

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

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

Нарешті, якщо ви грізний програміст, є ризик, що все, що ви торкаєтесь, створить нові помилки. Це, очевидно, нервує старших програмістів. Однак, кажучи: "Не робіть нічого. Не чіпайте нічого. Навіть не дихайте". мабуть, не правильний спосіб створити здорове робоче середовище. Освіта краща.

Висновок:

  • Програмне забезпечення, яке постійно отримує багато нових функцій, але жодних виправлень помилок неминуче не витягне.
  • Програмне забезпечення, яке отримує помірну кількість нових функцій, але виправляє помилки, має більше шансів на користь.
  • Ті, хто намагається мати кілька помилок, мають (в середньому) менше помилок, ніж ті, кому це все одно.
  • Нерозумно сподіватися на те, що програма врешті-решт стане вільною від помилок.
  • Старші програмісти не обов'язково компетентні.
  • Виправте ваші помилки.
  • Прийняти методики, які покращують якість вашого програмного забезпечення.

+1: Я сам шукав приклад бінарного пошуку, його побили;) Якщо 20 рядків широко обговорюваного та розповсюдженого коду тримали помилку протягом 20 років, скільки часу вам знадобиться для 20-мільйонної кодової бази ліній, що на більшість десятків зайнятих людей коли-небудь подивляться?
scrwtp

Дякую. Цікаво, чи пов’язана ця двійкова помилка пошуку (про яку я ніколи не чув) пов’язана з тим, що люди копіюють вставлення великого коду, не замислюючись? Крім того, якщо у нас є така кількість помилок, яких достатньо навіть перерахувати, можливо, інструменти та практики, якими ми користуємось, не є оптимальними?
Джоан Венге

1
@JoanVenge Я цитував цей приклад, щоб показати, як складні помилки можна знайти. У цьому випадку вставлення копій насправді було правильним , оскільки це було доведено правильним, а реалізація, написана з нуля, швидше за все матиме більше помилок. Інструменти та практика, які ми - як галузь загалом - використовуємо, безумовно, не є оптимальними. Найкращі практики легко ігнорувати, а шкідливі звички легко дотримуватися. Зрештою, помилки завжди будуть, тому що люди не є ідеальними. Але ми можемо зменшити кількість помилок, зробивши все можливе та наполягаючи на якісній освіті.
luiscubal

7
Я думаю, що помилка у двійковому коді пошуку демонструє, наскільки складне це питання. Помилка в пошуку була потенційним переповненням цілого числа в додатку. Такі "помилки" є всюдисущими, оскільки більшість людей покладаються на неявне (а іноді і неправильне) припущення, що введення даних не буде достатньо великим, щоб викликати переповнення. Це дійсно помилка чи просто погано задокументований контракт на інтерфейс? Коли в останній раз, коли ви знаходитесь в діапазоні, перевіряли суми в цілому додаванні або перевіряли на переповнення після факту?
Чарльз Е. Грант

4
Ваші приклади серверів виділяють досить очевидне спостереження щодо мови програмування та якості інструментів. Компілятор якості виробництва для надійної мови повинен був відмовитись від складання вашого першого прикладу, повертаючи натомість фатальну помилку компіляції. Те, що навіть МОЖЛИВО складати таку гидоту, говорить вам усе, що вам потрібно знати про якість цих інструментів та доцільність їх використання для доставки програмного забезпечення, що не потребує помилок.
Джон Р. Стром

12

Причини не написання програм без помилок здебільшого економічні.

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

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

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

(Аналогічно, тільки тому, що ви не можете написати програму для автоматичного вирішення істини будь-якої математичної теореми, це не означає, що ви не можете довести одну конкретну математичну теорему.)

Натомість проблема полягає в наступному:

Хоча теоретично можна написати програму без помилок, робити це було б дуже дорого . Написати код із підтвердженням його правильності складніше, ніж просто кинути щось на стіну, побачивши, чи він стирчить. Навіть якщо "бачити, чи стирчить", це робиться одиничними тестами; і багато програмістів навіть не роблять цього. Більшість програмістів навіть не знають, як це зробити, це означає, що як компанія вам доведеться наймати більш дорогі.

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

Тому люди свідомо виробляють програмне забезпечення, яке має певні шанси помилок, намагаючись досягти оптимальної комбінації, коли помилки не надто часті та не надто серйозні, а виробництво досить швидке та досить дешеве. Поєднання, яке забезпечує найбільший прибуток у реальному житті. (Іноді це навіть означає випустити програмне забезпечення, повне помилок, перш ніж ваші конкуренти випустять що-небудь, і лише випустити більш гідну версію 2.0, коли ваші конкуренти готові випустити свою першу гідну версію.)

Якщо ви заморозите розробку стільки часу, скільки вона повинна бути, чи зможете ви виправити всі помилки, доки просто не з’явиться жодна помилка, якщо таке можна перевірити комп'ютерами?

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

Розум економічно - це нормально. Ми живемо у світі, де гроші і час мають значення. Але тільки тому, що ми щось не робимо з економічних причин, ми не повинні говорити дурниць про те, як цього неможливо зробити навіть теоретично. Хто знає ... може бути, через кілька років ми будемо мати деякі нові мови програмування і інструменти , які могли б зробити правильність довести легко .


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

1
"Дорогий" відносний. Порівняйте вартість пошуку та виправлення помилок із вартістю, наприклад, радіотерапевтичний апарат, що вбиває декількох пацієнтів та пошкоджує кількох інших. (Google "Therac 25".)
Джон Р. Стром

6

Немає.

Девід Гільберт запропонував свою другу проблему математики ще в 1900 році, яка по суті попросила світ довести, що арифметика працює за призначенням. Пізніше він propsed « на проблему вирішення », який просив що - щось подібне в логічних термінах. " Перша теорема про незавершеність " Курта Гьоделя довів у 1931 р., Що жодна теорія елементарної арифметики не може бути одночасно послідовною та повною. Уявлення Алан Тьюрінга про проблему " Entscheidungsproblem" як " проблему, що зупиняється " перемістило цю проблему прямо до основи цього питання, де він довів, що неможливо довести, чи буде програма працювати до завершення чи ні. Враховуючи ту нерішучість, також неможливо довести, чи є в програмі якісь помилки чи ні.

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


9
Невизначеність застосовується лише загалом - є програми, для яких ви не можете довести ні коректності, ні неправильності. Але для певної конкретної програми часто можна довести правильність (або частіше: некоректність). Це передбачає, що у вас є формальна специфікація мови та компілятор, що має правильний досвід - останній не існує для жодної мови програмування високого рівня, хоча CompCert наближається.
Даніель

+1 для цитування відповідних теоретичних відомостей. Я ще не знав, що англійською мовою "Entscheidungsproblem" називається так само, як німецькою!
Peopleware

5
Погодьтесь із Даніелем. Проблема полягає в тому, що стосується одного екземпляра; проблеми зупинки стосуються всіх можливих випадків. Тривіально int main() { return 0; } зупиняється та не містить помилок.
MSalters

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

6

Errare humanum est

Навіть якщо ви пишете код з формальною мовою, як - от B-метод , який ви можете використовувати, щоб математично довести, що вимоги задовольняються,

Навіть якщо ви використовуєте офіційну мову специфікації,

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

Цей крок людини схильний до помилок, а черв’як - в яблуці.


1
Це все-таки помилка, коли програма робить те, що було запропоновано, а не те, що було призначено?
MSalters

Я думаю, що це ..
Джоан Венге

4
@MSalters - Звичайно, так і є. Не з контрактної точки зору, але врешті-решт замовник не вирішив свою проблему. Ви б летіли в літаку, чиї комп’ютери виконують те, що просять, а не те, що планували?
mouviciel

3

Справедлива частка «помилок», з якими я зіткнулася, може бути більш правильно описана як невідповідність між дизайном системи та очікуванням клієнтів.

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

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

Коротко:

Немає.


+1 У розробника та замовника можуть бути дуже різні погляди на те, що визначає "помилку".
GrandmasterB

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

2

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


1

Я вважав розділ Джима Шора No Bugs дуже корисним читанням на цю тему. Коротка форма: розвиватись без помилок неможливо - але ми можемо працювати таким чином, щоб виявити їх якомога раніше.

Під час виготовлення самого коду. Наприклад, часто записуючи та виконуючи тести модулів під час розробки, ми постійно запевняємо, що код робить те, що він повинен робити. Також корисно постійно переписувати наявний код таким чином, щоб він найбільш чітко виражав передбачувану поведінку системи.

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


1

Про перевірку за допомогою комп’ютерної частини.

Існує два способи перевірити програму за допомогою комп’ютера. Один тестує, інший використовує систему перевірки.

Як тільки вичерпне тестування неможливе, тестування стає неможливим, щоб показати, що програма не має помилок, а лише те, що у них є деякі. (У вас є проблема показати, що самі ваші тести не перевіряють на наявність помилок).

Щоб використовувати систему підтвердження, ви почнете з формальних вимог (і вони можуть самі мати помилку, сподіваємось, мова, яка використовується для цих вимог, буде більш придатною, щоб переконати себе, що помилки там немає, ніж з мовою програмування), і побудувати / довести за допомогою допомога систем підтвердження того, що програма відсутня помилок (і в системах перевірки виникає питання про помилки, але вони виявили себе правильними). Поточний стан техніки є компілятором для підмножини C (і підмножина не є академічною; "CompCert підтримує всі підмножини C MISRA-C 2004, плюс багато функцій, виключених MISRA").


Процитую Дональда Кнута (з пам’яті): Ви можете довести, що програма безкоштовна, але це не означає, що в ній немає помилок :-)
gnasher729

1

Ні, тому що комп’ютери та програмне середовище, на якому працює програма, продовжуватимуться змінюватися, навіть коли код застиг. Операційна система продовжує розвиватися за допомогою виправлень та виправлень, а також пристроїв та драйверів. Тільки коли ви думаєте, що ви дійшли до точки, коли невідомі помилки, AMD або nVidia випустять оновлення драйвера відео, яке вплине на взаємодію з відеосистемою. Тепер у вашої програми є дефекти зору (наприклад, мерехтіння, мерехтіння або зменшення частоти кадрів) для клієнтів, які мають певну відеокарту чи конфігурацію (SLI? LOL).

Крім апаратних засобів та ОС, під найважливішими додатками також є ряд програм середнього програмного забезпечення, які також розвиватимуться поза вашим контролем, і так само, як ви отримаєте свій код до стану нульового дефекту, шари під ним ви отримаєте EOL'ed.

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

Ні, в якийсь момент бізнес буде шукати більш гнучку команду розвитку, яка підтримує необхідність рухатися вперед зі швидкістю технології. Це основна проблема, з якою стикаються сучасні команди розвитку.


0

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

Це нечітка річ. Мало систем задано до останнього біта. Якщо система працює добре, і користувачі не мають жодних скарг (їх нічого не помиляє), і вони повністю пристосовані до неї, ви можете також назвати її помилкою.


-2

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

Але роблячи це, ви, як правило, не збираєтеся будувати 20 MLOC-систему. Якщо написання коду без помилок не є вашою метою, також не слід створювати багато систем MLOC.

Моє власне міркування таке:

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

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

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

Це стосується Вашого питання:

  • Враховуючи помилку в програмному забезпеченні, ви виправите це взагалі? Вам потрібен програміст, щоб виправити помилку, і програміст коштуватиме гроші. Програміст не може вирішити, витрачати гроші на це. Це роль людини, яка тримає бюджет.
  • Чи можу я створити програмне забезпечення 20MLOC з нуля, не залишаючи непоправлені помилки врешті? Ну, маючи на меті побудувати 20МЛОК, необхідний намір витратити величезну суму грошей. Це фінансово нерозумно. І це не будується за один день. Але програмне забезпечення призначене для сьогоднішніх потреб, а не завтра. Буде помилкова спроба паралелізації розвитку шляхом найму багато програмістів. Але тоді шанси ви не отримаєте спільну культуру, і виникнуть помилки, трапляються відходи та затримка, і гроші виправляться. Я ще не бачив жодної системи таких помилок. (Я бачив системи без помилок та системи 20MLOC, але вони не були однаковими)
  • Я відповідаю за підтримку системи 20MLOC, про яку я не писав. Чи зможу я досягти нуля відомих помилок? Це не залежить від програмістів. Вони не можуть вирішити виправлення помилок, оскільки це не їх гроші на лінії. Чи достатньо рентабельності інвестицій, щоб виправити решту помилок? Що ж, система існує вже деякий час, і користувачі звикли до неї, і використовують корисність системи з користю для своєї щоденної роботи. Якщо ви виправляєте помилки за принципом, людині з цими грошима, можливо, доведеться заплатити, щоб переробити якусь не визначену функцію, яка зникла з системи, коштуючи ще більше грошей.

Вся справа в грошах, і це правильно.


-2

Так.

Але, як відомо, це вимагає занадто великих зусиль, щоб того вартий.

Перш ніж я зможу захистити свою відповідь, спершу слід визначити, що таке помилка:

  • Помилка - це поведінка, яка суперечить специфікації.
  • Однак глюки в специфікації (наприклад, 0-й закон робототехніки) не вважаються програмними помилками.
  • Додаткові функції не вважаються помилками, якщо це заборонено специфікацією.
  • Для аргументації суперечності в специфікації також не вважаються програмними помилками.

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

"Але чекай!" Я чую, як ви протестуєте: "Що робити, якщо несподівана (але все-таки правильна) поведінка одного модуля викликає помилку в іншому?" Тоді помилка знаходиться у другому модулі. Модулі, що не містять помилок, можуть розглядатися як API, а API, як відомо, потребує певної обережності, щоб правильно використовувати.

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

"Але дайте мені місце стояти, і я переміщу світ". - Архімед


Це вимагає зусиль, але які окупаються.
Лоран LA RIZZA

1
Якщо ви залишаєте помилки із специфікацій з рівняння, все ваше програмне забезпечення стає марним: Технічні характеристики - це лише інструменти для запису потреб користувачів порівняно формально, але врешті-решт саме користувач повинен бути задоволений, а не специфікація. А створення специфікації - це стільки ж частини розробки програмного забезпечення, скільки і написання коду. Зрештою, повна формальна характеристика описує поведінку системи так само, як і остаточний код, специфікація просто не є ефективно виконуваною.
cmaster
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.