Открытие кодов с исправлением ошибок, как первых кодов Хэмминга, так и разработанных впоследствии более эффективных кодов, преобразило проектирование информационных систем. Больше не требовалось создавать системы с двойной проверкой, нуждающиеся в столь сильной защите – защите, которая полностью исключала бы возможность ошибок. После открытий Хэмминга и Шеннона было достаточно сделать ошибки просто редкими, чтобы гибкость кода с исправлением позволяла нейтрализовать любые искажения. В настоящее время коды с исправлением ошибок используются в тех случаях, когда необходимо обеспечить быструю и надежную передачу данных. Орбитальный модуль Mariner 9 отправлял снимки поверхности Марса на Землю с использованием одного из таких кодов, кода Адамара. Компакт-диски кодируются с помощью кода Рида – Соломона – именно поэтому они звучат идеально, даже если их поцарапать. (Читатели, родившиеся после 1990 года и не знающие, что такое компакт-диски, могут просто вспомнить о картах флеш-памяти, в которых среди прочего используется код Боуза – Чоудхури – Хоквингема, чтобы предотвратить нарушение целостности данных.) Код вашего банка шифруется с помощью простого кода, который называется «контрольная сумма». Это не код с исправлением ошибок, а просто код с обнаружением ошибок, подобный протоколу «повторить каждый бит дважды». Если вы напечатаете одну цифру неправильно, компьютер, выполняющий перевод, может не понять, какое число вы на самом деле имели в виду, но он хотя бы определит, что что-то не так, и не отправит ваши деньги не в тот банк.
Не совсем ясно, когда именно Хэмминг понял весь диапазон применения своего нового метода, однако его руководство в Bell наверняка отдавало себе отчет, что стоит за его открытием. Хэмминг выяснил это, когда попытался опубликовать свою работу:
Патентный отдел не давал разрешение на публикацию до тех пор, пока не была обеспечена патентная защита… Я не верил, что они могут запатентовать кучку математических формул. Я так им и сказал. Они ответили: «Вот увидите». И были правы. С тех пор я понимаю, что плохо знаю патентное законодательство, поскольку часто бывает так, что вы вынуждены патентовать такие вещи, которые не нуждаются в этом, и это возмутительно
{192}.
Однако математика двигается вперед быстрее, чем патентное бюро. Швейцарский математик и физик Марсель Голей узнал об идеях Хэмминга от Шеннона и разработал много новых кодов, не зная о том, что Хэмминг разрабатывал такие же коды за завесой патентного права. Голей опубликовал свои работы первым, что повлекло за собой путаницу в отношении авторских прав, которая сохраняется до сих пор
{193}. Что касается патента, в Bell его получили, но потеряли право взимать деньги за лицензию в рамках антимонопольного соглашения 1956 года
{194}.
Что делает код Хэмминга столь эффективным? Чтобы понять это, необходимо взглянуть на ситуацию под другим углом и поставить вопрос так: что могло бы стать причиной его провала?
Помните: настоящее проклятие любого кода с исправлением ошибок – это блок цифр, который очень близок к двум разным кодовым словам одновременно. Получатель, в адрес которого отправлена проблемная комбинация битов, окажется в затруднительном положении, не имея надежного способа определить, какое из кодовых слов было в исходном сообщении.
Что мы имеем в виду, когда говорим про «близость» одного блока к другому? На первый взгляд может показаться, что мы используем метафору, поскольку блоки двоичных знаков не имеют местоположения. По твердому убеждению Хэмминга, понятие близости отнюдь не метафора и таковой не должна восприниматься – именно в этом и заключался его важный концептуальный вклад. Он ввел новое понятие расстояния, которое теперь называется расстоянием Хэмминга. Концепция расстояния была адаптирована к новой математике информации точно так же, как расстояние Евклида и Пифагора было адаптировано к геометрии плоскости. Хэмминг дал простое определение: расстояние между двумя блоками символов – это количество битов, которые необходимо изменить, чтобы превратить один блок в другой. Таким образом, расстояние между кодовыми словами 0010111 и 0101011 равно 4; чтобы превратить первое кодовое слово во второе, необходимо изменить биты во второй, третьей, четвертой и пятой позициях.
Восемь кодовых слов Хэмминга – хороший код, поскольку ни один блок из семи бит не находится на расстоянии Хэмминга между двумя кодовыми словами, равному 1. Если бы это было так, два кодовых слова были бы на расстоянии Хэмминга 2 друг от друга
[227]. Но вы можете проверить это сами – и увидите, что нет таких двух кодовых слов, которые отличались бы на две позиции; на самом деле расстояние Хэмминга между любыми двумя кодовыми словами равно 4. Вы можете провести аналогию между этими кодовыми словами и электронами в коробке или необщительными людьми в кабине лифта. Они находятся в ограниченном пространстве и в пределах этих ограничений пытаются расположиться как можно дальше друг от друга.
Этот же принцип лежит в основе всех возможных каналов коммуникации, устойчивых к помехам. Именно так устроен естественный язык: если я напишу lanvuage вместо language («язык»), вы поймете, что я имел в виду, поскольку в английском языке это единственное слово, которое можно получить посредством замены одной буквы в слове lanvuage. Безусловно, данный принцип не сработает при употреблении односложных слов: dog, cog, bog и log – каждое из этих слов имеет свое значение в английском языке, но всплеск шума, заглушающий первую фонему, не позволит распознать, что именно имелось в виду. Однако даже в таком случае можно использовать семантическое расстояние между словами, чтобы исправить ошибки. Если вас что-то укусило, значит, это dog («собака»); если вы с чего-то упали, то это log («бревно») и так далее.
Язык можно сделать более эффективным, но при этом возникает тот же негативный побочный эффект, с которым столкнулся Шеннон. В свое время многие люди, и упертые зануды и те, кто обладал математическими наклонностями,
[228] потратили массу усилий на создание языков, которые обеспечили бы компактную и точную передачу информации без всякой избыточности, синонимии и двусмысленности – всего того, чем грешат такие языки, как английский. Священник Эдвард Пауэлл Фостер создал в 1906 году искусственный язык Ро, с тем чтобы заменить дебри английского словаря лексиконом, в котором значение каждого слова можно было логически вывести из его звучания
{195}. Пожалуй, нет ничего удивительного в том, что среди горячих приверженцев языка Ро был Мелвилл Дьюи, который создал десятичную систему классификации, обеспечивающую расположение книг на полках библиотек в строгом порядке. Лаконичность языка Ро действительно заслуживает восхищения. Многие длинные английские слова, такие как ingredient, на языке Ро становятся гораздо короче – просто cegab. Однако подобная лаконичность имеет свою цену: она сопровождается потерей возможности исправлять ошибки, присутствующей в английском языке как встроенная функция. Это как маленькая, заполненная до отказа кабинка лифта, в которой у пассажиров нет дополнительного личного пространства. Другими словами, каждое слово на языке Ро очень похоже на многие другие слова, что создает возможности для путаницы. Например, на языке Ро «цвет» – это bofab. Но если вы измените всего одну букву, получаются следующие слова: «звук» – bogab; «электричество» – bokab; bolab – «вкус». Более того, в логической структуре языка Ро слова с похожим звучанием имеют похожее значение. Это обстоятельство еще больше усугубляет ситуацию, поскольку не позволяет по контексту понять, что происходит. Слова bofoc, bofof, bofog и bofol означают «красный», «желтый», «зеленый» и «голубой» соответственно. Концептуальное сходство звучания слов имеет свой смысл, но именно это затрудняет разговор, например, о том же цвете на той же людной вечеринке: «Простите, вы сказали “bofoc” или “bofog”?»
[229]