Книга Эффект плато. Как преодолеть застой и двигаться дальше - Хью Томпсон
Шрифт:
Интервал:
Закладка:
Наконец новые машины добрались и до школы, в которой учился Хью, однако к ним были прикреплены рукописные объявления: «Только 25-центовые монеты США». Когда Хью вместе со своими страдавшими от жажды друзьями добрался до одной из этих машин, ни у кого не оказалось американских четвертаков, и ребята начали экспериментировать. Один бросил в прорезь металлическую шайбу в надежде, что это каким-то волшебным образом поможет получить газировку. Шайба тут же выскочила обратно. Тогда они засунули в прорезь американский 10-центовик. Ничего. Багамский 25-центовик. Безрезультатно. Кто-то вспомнил, что в таких ситуациях иногда помогает соленая вода. Из этого тоже ничего не вышло, не считая того, что машина оказалась полностью мокрой. В течение получаса ребята запихивали в машину все, что только могли найти в карманах (в их защиту стоит сказать, что они к тому моменту еще не достигли пубертатного возраста). Ничего не получалось до тех пор, пока кто-то не бросил в прорезь багамскую монету в 10 центов.
Эта монета ничуть не похожа на 25-центовую американскую монету. Она обрезана по краям, что делает ее немного похожей на серебряный цветок. К немалому удивлению Хью и его друзей, на дисплее высветилась цифра «25» – машина ошибочно приняла монету за американский четвертак. Они пошарили по карманам и нашли еще три монетки в 10 центов. На дисплее последовательно высветились цифры «0,50», «0,75» и, наконец, «1,00» (на острове довольно высокие цены). Они нажали кнопку «Выбрать», и – ба-бам! – из ящика вылетела бутылка газировки. Это был один из самых примечательных моментов в детстве Хью.
Много лет спустя Хью узнал, что машина измеряла диаметр и вес каждого объекта, попадавшего в прорезь. По стечению обстоятельств, багамские 10-центовики имели почти тот же вес и диаметр, что и американские четвертаки. Не понимая механики машины, Хью и его друзья применили по сути метод случайных входных параметров в надежде на то, что это приведет к чему-то интересному. В этом и состоит суть фаззинга: применение входных параметров с тем или иным элементом случайности и последующим изучением неожиданных исходов.
Машина, торговавшая газировкой, нормально реагировала на обычное использование, однако отказала, столкнувшись с необычным сценарием. С этой проблемой сталкивалось множество систем, начиная от атомной станции в Фукусиме и заканчивая «Титаником». Люди, оценивающие подобные системы, обычно ограничены правилами логики, но реальный мир редко бывает столь же негибким. Говоря иными словами, системы немеют.
Именно в этот момент на сцене и появляется фаззинг. Тех, кто занимается им, можно сравнить с обезьянками на амфетаминах, пробующих любые действия в надежде что-то сломать. У них мало правил и почти нет ограничений. Они просто делают то, что считают нужным. Нормальный, рассудительный человек не будет вопить в течение часа на машину, торгующую газировкой, и ожидать, что в результате получит бесплатную бутылку. А заряженная амфетаминами мартышка вполне может это попробовать. И кто знает, может быть, в машине есть какой-нибудь сенсор, изучающий окружающую какофонию: думая, что звуки исходят от грузовика, развозящего воду, она разблокирует свою защиту. Современные системы настолько сложны, что никто не знает точно, к чему могут привести необычные стимулы. Хью лично столкнулся с этим во время своего полета из Лас-Вегаса в Орландо{27}.
Перед каждым сиденьем самолета был небольшой экран, вмонтированный в спинку. Пассажиры во время рейса могли смотреть один из нескольких телевизионных каналов или играть в несколько простых игр. Одна из игр выглядела поразительно похожей на классическую стратегическую игру «Тетрис», в которой игроки пытаются перемещать падающие объекты так, чтобы они образовывали завершенные горизонтальные линии. Причем предлагалось указать количество элементов, которые можно было заранее увидеть в ходе игры: «ноль» означал полную непредсказуемость, а «четыре» позволяло планировать на несколько шагов вперед. Для того чтобы получить максимальное преимущество, Хью начал нажимать большую кнопку со знаком «+» на экране и постепенно дошел до максимального значения, равного четырем.
Рядом с его креслом располагалась небольшая телефонная консоль, с помощью которой пассажиры могли позвонить друзьям и членам семьи всего за 22 доллара в минуту. Хью заметил, что у телефона имеется цифровая клавиатура и что с ее помощью можно было контролировать «Тетрис», в том числе и уровень сложности. Он попытался ввести с помощью телефонной клавиатуры «10», но безуспешно. Значение на экране сначала изменилось на «1», а затем на «0» – то есть два нормальных, вполне допустимых значения. Разочарованный, Хью предположил, что у него нет никаких вариантов ввести в игру двузначные значения. Он попробовал цифру «8» – опять безрезультатно. Номер на экране даже не изменился.
Затем он попробовал цифру «5»… И – ура! – игра ее приняла!
Цифра «5» представляет в данном случае немалый интерес. Тестеры программных продуктов называют его пограничным значением{28}, поскольку оно лишь немного превышает максимально допустимое значение (пограничное), которое была готова принять программа (в данном случае «4»). Частая ошибка в программировании состоит в «ошибке на одно значение» при создании логики программы{29}. К примеру, программист мог намереваться написать код, означавший: «Значение параметра должно быть меньше пяти».
Однако фактически программный код означал: «Значение параметра должно быть меньше или равно пяти».
В большинстве языков программирования разница между этими формулами состоит в одном-единственном нажатии на клавишу.
Итак, теперь игра шла на неизведанной территории, в систему было введено непредвиденное значение пять. Затем Хью снова переключил свое внимание на сенсорный экран и нажал кнопку «+», которая, к его «ботаническому» восторгу, позволила увеличить значение до «6»! Возможно, логика, которая прежде не позволяла ему ввести значение выше предельного, формулировалась так: «При значении, равном четырем, не увеличивать». В данном случае значение составляло не четыре, а пять, поэтому нажатие кнопки «+» позволило успешно повысить его до шести. Хью открыл упаковку арахиса и принялся нажимать кнопку «+» до тех пор, пока значение не достигло 127. Тут он решил остановиться и поразмышлять.
Число 127 играет особую роль в компьютерных науках. По сути, это своего рода плато. С технической точки зрения это два в седьмой степени минус единица (27 − 1). В некоторых случаях это максимальное значение, с которым может справиться определенная система. Чтобы понять, почему это так, подумайте о ситуациях, когда вы используете для счета собственные пальцы. Давайте предположим, что вы считаете привычным образом, то есть ваши выпрямленные шесть пальцев означают цифру «6». Если, используя этот метод, вы попытаетесь посчитать более чем до десяти, то столкнетесь с проблемой – количество ваших пальцев ограниченно. Дети обычно стараются запомнить, что уже прошли этот цикл один раз, и затем вновь начинают выпрямлять пальцы, но первый из них означает уже не 1, а 11. Однако представьте себе, что вам нужно отправить кому-то фотографию ваших пальцев. В этом случае вы не можете показать на фотографии 12 или 13, потому что на картинке это будет выглядеть как два или три. Эта проблема возникает, поскольку на уровне десяти мы достигли предельного значения для пальцев, а добавляя к нему что-то еще, мы сталкиваемся с тем, что специалисты по компьютерным наукам называют целочисленным переполнением. Иными словами, мы попытались сохранить больше информации, чем можно. При использовании пальцев, для того чтобы посчитать до 11, мы, доходя до максимального значения (10), «возвращаемся» к минимальному значению – в случае с пальцами это означает 1. Такая же проблема возникает и в программах, где для хранения числа используется набор так называемых бинарных переключателей («вкл/выкл»). Когда число превышает совокупную емкость переключателей, программа просто перегружает значение до минимально допустимого. Представьте себе, что вы считаете от 1 до 100, но при этом видите только последнюю цифру в каждом числе. Может показаться, что вы движетесь от 0 до 9, а затем вдруг опять к 0. Когда подобное явление происходит в области программирования, оно способно привести к всевозможным проблемам.