Спочатку був ENIAC Mark I. Одного разу оператор помітив збої в роботі машини. Виявилося, проблеми виникли через метелика, який залетів у комп'ютер і був розчавлений під контактами реле.
Оператор вийняв метелика, підклеїв його в системний журнал і зробив позначку: «У системі виявлено комаха (bug)». Так з'явився перший комп'ютерний баг.
Моє знайомство з багами відбулося набагато пізніше. Я написав свою першу програму в 11 років. Програма містила всього одну асемблерну команду для обчислення суми 2 + 2. Результат чомусь виявився дорівнює 2. Програма складалася всього з однієї команди, і все одно в ній був присутній баг!
У цьому розділі представлений ряд «перших» програм: перша, над якою я просидів до 2 години ночі в пошуках помилки (програма 3); перший відповідь на питання на першому іспиті з програмування, який я брав (програма 2); і звичайно, «Hello World» - найперша програма в будь-якій книзі по програмуванню.
Ще зовсім недавно, щоб внести гроші на рахунок, людям доводилося заходити в банк і звертатися до касира. Зазвичай при цьому використовувалися готові бланки, вклеєні в кінець чекової книжки. Номер рахунку заздалегідь друкувався магнітними чорнилом в нижній частині бланка.
Якщо в чековій книжці кінчалися порожні бланки, клієнт отримував бланк у касира. Звичайно, на такому бланку номер рахунку вказаний не був, тому клієнту доводилося вписувати його вручну.
Якийсь шахрай надрукував власний варіант депозитних бланків. Зовні вони нічим не відрізнялися від звичайних «загальних» бланків, але на них магнітними чорнилом було завдано номер рахунку шахрая.
Потім він пішов в банк і підклав ці бланки в загальний лоток.
Афера працювала так: клієнт приходив в банк, щоб покласти гроші на рахунок, і отримував один з підроблених бланків. Він заповнював бланк і вносив гроші. Оскільки на бланку був надрукований номер рахунку, комп'ютер автоматично обробляв його і вносив гроші на цей рахунок. На номер рахунку, вручну написаний на бланку, він не звертав уваги. Іншими словами, шахрай привласнював чужі депозити.
Сищик, якому доручили цю справу, був спантеличений. Внесені гроші зникали, і ніхто не розумів, як це відбувається. Вдалося з'ясувати, що проблема виникає тільки при внесенні грошей безпосередньо в банку. Сищик вирішив спробувати зробити велику кількість вкладів і подивитися, що буде. Оскільки він використовував власні гроші, йому доводилося обмежитися дрібними вкладами ... дуже, дуже дрібними. Кожен внесок був на суму в 6 центів.
Сищик витратив цілий тиждень. Він приходив у банк, заповнював бланк, вставав в чергу, вносив 6 центів, потім заповнював новий бланк, вставав в чергу, вносив 6 центів і т. Д. Касири вирішили, що він збожеволів. Але ось один з вкладів зник. Тоді на вимогу сищика в банку перевірили, чи не вносив хтось ще в цей день суму 6 центів. Такий внесок знайшли, і злодія впіймали.
Програма 1. Hello World
Практично всі книги з програмування починаються з програми «Hello World». Наша книга теж відноситься до їх числа ... але у нас навіть ця програма містить помилку.
Як можна зламати щось настільки елементарне, як «Hello World»? Подивіться самі:
(Підказка 228, відповідь 6)
Користувач: Я не можу підключитися до системи. Модем не хоче встановлювати зв'язок.
Консультант: Подивіться на свій модем і скажіть, які вогники на ньому горять.
Користувач: Не можу.
Консультант: Щоб я допоміг з вирішенням ваших проблем, ви повинні точно описати, що у вас відбувається. Будь ласка, подивіться на модем і опишіть його стан.
Користувач: Нічого не вийде.
Користувач: Модем коштує в підвалі.
Консультант: Тоді чому б вам не спуститися і не подивитися?
Користувач: Ви жартуєте? Там під два метри води!
Консультант: Комп'ютери під водою не працюють.
Користувач (здивовано): Серйозно?
Програма 2. Учительський конфуз
Колись я займався викладанням мови C. Пропоную вашій увазі першу задачу з першої контрольної, яку я проводив.
Ідея була проста: я хотів дізнатися, чи розуміють учні, ніж автоматична змінна
16 int i = 0;
відрізняється від статичної змінної
26 static int i = 0;
Але після контрольної мені довелося визнати неприємний факт: я сам відповів би на це питання
неправильно. Тому мені довелося встати перед аудиторією і сказати: «Є два шляхи отримати вищий
бал за першу задачу. По-перше, ви можете дати правильну відповідь; по-друге, ви можете дати ту відповідь,
який я вважав правильним ».
Так яким же повинен бути правильна відповідь?
(Підказка 139, відповідь 102)
Церква придбала свій перший комп'ютер, і службовці потроху вчилися користуватися ним. Секретарка вирішила підготувати типову заготівлю тексту похоронної служби; ім'я покійного всюди замінювалося тегом. Перед похороном залишалося лише замінити цю послідовність символів справжнім ім'ям.
В один із днів проводилося відразу двоє похорону: першу покійницю звали Марія, а другу - Една. Секретарка провела глобальну заміну підрядка на подстроку Марія. Все вийшло чудово. Потім вона тут же згенерувала текст другої похоронної служби, замінивши ім'я Марія ім'ям Една. А ось цього робити не варто ...
Тільки уявіть здивування священика, коли він прочитав: «... і матір божа, благословенна діва Една ...»
Програма 3. Ранковий сюрприз
Цю програму написав один мій друг, коли ми вчилися в коледжі. Нам задали написати програму множення матриць, проте саму функцію множення слід написати на асемблері. Щоб програма працювала як можна швидше, один скористався розробленим мною алгоритмом векторизації матриці.
Щоб протестувати готову систему, він написав коротку тестову функцію на SAIL, але при тестуванні були отримані неправильні відповіді. Ми вдвох прискіпливо вивчали кожен рядок програми з 8 вечора до 2 години ночі. А коли помилка нарешті виявилася, ми обидва розреготалися - до того нерозумно все це було.
Наступний приклад є спрощеною версією цієї знаменитої програми. Він написаний на одній мові (C) і використовує сильно спрощений алгоритм множення. І все ж вихідна помилка в ньому збережена. Чи вдасться вам її знайти?
(Підказка 34, відповідь 53) закрити