Schrödinbug — це унікальний тип програмної помилки, яка існує в коді, але ніколи не проявляється доти, доки розробник не прочитає цю ділянку коду та не усвідомить, що вона містить баг. Термін — гра слів із «котом Шредінгера»: баг одночасно і є, і його немає, поки за ним не спостерігають. За даними Вікіпедії (2026), цей термін використовується переважно в професійному жаргоні та описує скоріше психологічний, ніж технічний феномен у роботі розробника.
Головне
Schrödinbug — термін із професійного сленгу розробників, що позначає програмну помилку, яка роками існує в коді, але ніколи не призводить до збою, поки хтось не прочитає цю ділянку коду та не зрозуміє, що тут помилка. Після цього баг починає проявлятися.
Назва явно відсилає до уявного експерименту Ервіна Шредінгера з котом, який одночасно живий і мертвий, поки спостерігач не відкриє коробку. У випадку з багом — він одночасно «працює» і «зламаний», поки розробник не подивиться на код.
Важливо розуміти, що Schrödinbug — це не технічна особливість виконання програми, а когнітивний феномен. Код об'ктивно містить помилку, але збіг обставин або особливості вхідних даних ніколи не активували проблемний шлях виконання до моменту, поки розробник не проаналізував код.
З технічної точки зору Schrödinbug — це звичайний логічний дефект, який ніколи не потрапляв у виконуваний потік програми через те, що всі виклики проходили «щасливим» шляхом. Як тільки розробник читає код, він змінює свою поведінку або режим тестування — і баг проявляється.
Назва Schrödinbug — контамінація прізвища фізика Ервіна Шредінгера та слова «bug» (помилка). Шредінгер у 1935 році запропонував уявний експеримент, що ілюструє проблему копенгагенської інтерпретації квантової механіки.
Експеримент з котом: у закритій коробці знаходяться радіоактивна речовина, лічильник Гейгера та колба з отрутою. Якщо речовина розпадається — лічильник запускає механізм, що розбиває колбу, і кіт помирає. Поки коробка закрита, кіт одночасно живий і мертвий (суперпозиція станів).
Аналогія з програмуванням: поки ніхто не читав ділянку коду з помилкою, програма працює коректно — баг «живий» і «мертвий» одночасно. Як тільки розробник відкриває файл і читає код, суперпозиція руйнується, і баг починає проявлятися («вмирає» коректна робота програми).
Schrödinbug — це в першу чергу психологічний феномен, а не технічна особливість виконання коду. Розглянемо механізм його виникнення з точки зору когнітивної психології програміста.
Коли розробник пише код, він перебуває в стані «потоку» і може не помітити логічну помилку. Код проходить код-рев'ю, тести, потрапляє в продакшен і працює місяцями. Потім розробник повертається до цього коду для рефакторингу, читає його уважно і раптом бачить: «Тут же очевидна помилка!»
Після усвідомлення помилки розробник починає цілеспрямовано шукати сценарії, за яких баг проявиться. Він змінює тестові дані, запускає відладчик, проходить по гілках коду — і в якийсь момент дійсно викликає збій. Баг «виявляється» саме тому, що розробник тепер знає, де шукати.
Когнітивне викривлення — confirmation bias — відіграє ключову роль. Розробник, побачивши помилку в коді, підсвідомо починає шукати її прояв у поведінці програми. Будь-який незвичний лог або збій одразу інтерпретується як наслідок знайденої помилки, навіть якщо реальна причина може бути іншою.
Розглянемо кілька реальних сценаріїв із практики розробки, які описують класичний Schrödinbug.
У Android-додатку розробник використовував прапорець `isEnabled = true` за замовчуванням, хоча передбачалося, що нова функція має бути вимкнена. Код із неправильним прапорцем працював у продакшені три місяці — ніхто не скаржився, тому що функція дійсно мала бути ввімкнена. Коли розробник читав код для підготовки наступного релізу, він зрозумів помилку, виправив прапорець на `false` — і одразу отримав баг-репорт, що функція зникла.
Метод бібліотеки містив очевидну помилку ділення на нуль, але ніколи не викликався в реальних сценаріях. Бібліотека використовувалася в п’яти проектах, і ніхто не помітив проблеми. На код-рев'ю новий розробник вказав на помилку — і після виправлення виявилося, що один із проектів залежав від цієї «неправильної» поведінки.
Schrödinbug займає унікальне місце в класифікації програмних помилок. Порівняємо його з іншими типами.
| Тип бага | Прояв до читання коду | Прояв після читання коду | Природа |
|---|---|---|---|
| Schrödinbug | Ніколи | Починає проявлятися | Психологічна |
| Bohrbug | Завжди за тих самих даних | Завжди за тих самих даних | Детермінована |
| Mandelbug | Іноді, хаотично | Іноді, хаотично | Системна |
| Heisenbug | Стабільно | Зникає у відладчику | Технічна |
Schrödinbug — єдиний тип бага, чий прояв безпосередньо залежить від факту усвідомлення помилки розробником. У цьому його парадоксальна природа.
Хоча Schrödinbug — явище скоріше психологічне, існують практичні методи мінімізації його впливу на проект.
Чим раніше помилка буде виявлена, тим менша ймовірність, що вона потрапить до категорії Schrödinbug. Парне програмування та обов’язковий код-рев'ю кожного рядка коду знижують кількість прихованих дефектів до мінімуму.
Статичні аналізатори коду (ESLint, detekt, ktlint, SpotBugs) виявляють потенційні помилки на етапі компіляції, не чекаючи, поки їх помітить людина. Лінтери здатні виявляти «сплячі» баги в мертвих гілках коду.
Покриття тестами всіх гілок коду, включаючи рідко використовувані, — єдиний спосіб гарантувати, що Schrödinbug не буде роками чекати своєї години. Інструменти на кшталт JaCoCo для Java допомагають відстежувати непокриті розгалуження.
// Example of potential Schrödinbug — bug in rarely called branch
def processOrder(Order order) {
if (order.isRush()) {
// This branch was never tested in production
sendRushNotification(order) // there may be a bug here
}
}
У цьому прикладі Schrödinbug може існувати роками, якщо термінові замовлення (rush) ніколи не надходили до системи. Як тільки перше таке замовлення з’явиться — баг проявиться, але до цього моменту розробники думають, що код коректний.
Часті запитання
Schrödinbug — це реальне явище з професійного жаргону, але воно описує скоріше когнітивний і психологічний феномен, ніж технічну категорію помилки. Термін використовується розробниками для опису ситуації, коли усвідомлення помилки в коді призводить до її першого прояву.
Парадокс полягає в тому, що баг об'ктивно існує, але суб'ктивно не проявляється до моменту його виявлення. До читання коду програма працює коректно, хоча в ній є помилка. Після читання — баг «матеріалізується» і починає викликати збої.
Аналогія пряма: як кіт Шредінгера одночасно живий і мертвий, поки не відкрита коробка, так і Schrödinbug одночасно «працює» і «зламаний», поки розробник не відкриє файл із кодом і не прочитає його. Спостереження руйнує суперпозицію.
Так, Schrödinbug може бути небезпечним, якщо прихована помилка знаходиться в критичній ділянці коду, яка рідко виконується — наприклад, в обробці платежів за специфічних умов або в логіці відновлення після збою. Виявлення такої помилки в найнесподіваніший момент може призвести до серйозних проблем.
Єдиний надійний метод — забезпечити 100% покриття коду тестами, включаючи всі розгалуження та граничні умови. Якщо кожен рядок коду виконується хоча б в одному тесті, Schrödinbug буде виявлений на етапі тестування, а не після читання коду в продакшені.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також