До того, как я приступил к проекту редактирования в WebKit, я думал, что благодаря этим правилам, все будет работать примерно так, как, в общем, и должна работать обработка текста. И я был уверен, что замечу, если какое-то из этих правил перестанет работать — например, почему выровненный по левому краю текст вдруг стал неровным слева? Да, умом я эти правила не понимал. Теперь, когда мне предстояло превратить функцию WebKit в полноценный текстовый редактор, я больше не мог позволить себе роскошь опираться на интуитивные ощущения при наборе и редактировании электронных писем. Я должен был стать экспертом, знающим все тонкости текстовых редакторов. По этой теме не существует учебников для программистов, поэтому мне приходилось проводить эксперименты, чтобы выяснять, что и как работает. Мне нужно было сжиться с буквой и духом всех этих правил, простых и сложных. Я потратил много времени, прощупывая различные текстовые редакторы: Microsoft Word, Apple Mail и BBEdit — редактор, который я использовал для того, чтобы писать программы. Я проверял, «прокликивал», набирал текст, щелкал мышью. Постепенно я узнал и о других правилах, и о том, как написать код, чтобы обеспечить их выполнение. Сделав это, я попал в тупик.
У меня не получалось заставить курсор всегда вести себя правильно. По большей части он работал так, как ожидалось, но потом случалось что-то неожиданное. Иногда мигающий курсор превращался в яркое пятнышко и начинал двигаться. Иногда он исчезал вообще после щелчка мышью. Иногда он пропускал символы или строки, а то и просто перепрыгивал в случайное место, когда я набирал текст. Иногда после нажатия клавиши он появлялся снова, а иногда — нет. Мои беды с курсором относились к самым ужасным ошибкам, с которыми только может столкнуться программист, поскольку неправильное поведение не всегда удавалось исправить, если я возвращался и повторял те же шаги.
У программистов для подобных проблем есть свое название. Мы позаимствовали его из квантовой механики, от имени Вернера Гейзенберга, который вывел принцип неопределенности. Мои проблемы с курсором назывались «гейзенбагами»[23]
. И их исправление оказалось самой трудной задачей в программировании, с какой мне когда-либо приходилось сталкиваться.Чтобы дать полное техническое объяснение этих проблем, я сражался с кодом, заставляя его показывать правильный видимый результат. Мне нужно было описать формат веб-страниц HTML (Hypertext Markup Language, язык гипертекстовой разметки), а также понятные лишь посвященным вещи, такие, как древовидные структуры объектной модели документа, алгоритмы обхода бинарного дерева и многое другое. Проведем аналогию. Представьте себе следующую ситуацию.
Как эти люди (клиент и исполнитель заказа) могут убедиться, что поняли друг друга правильно? Это станет еще труднее, если я уберу необходимые знаки препинания и заглавные буквы, чтобы ближе передать ощущения двух людей, разговаривающих друг с другом:
Мы не будем особенно удивлены, если в некоторых случаях возникает недопонимание по поводу того, как должен выглядеть торт. Возможно, заказчик говорит не слишком четко. Может быть, пекарь страдает хроническим дефицитом здравого смысла или у него просто был длинный тяжелый день. Из-за чего бы ни произошла подобная неудача, в результате может получиться комическая путаница.
В моем примере с заказом предполагалось, что по требованию клиента на торте будет написано только четыре слова: «с», «днем», «рождения» и «Том», но было также и указание о том, как их разместить, и все эти сведения были в неявной форме зашифрованы в первоначальной устной просьбе. В большинстве случаев люди могут понять их из контекста, но иногда интерпретируют неправильно, и то, что получается в итоге, можно увидеть, если набрать в Google поисковый запрос «испорченный праздничный торт».
Текстовые редакторы в чем-то похожи на заказы праздничных тортов. Когда вы набираете в одном из них слово, затем помечаете его и выделяете жирным шрифтом, затем кликаете мышью в другое место и печатаете что-то еще, вы создаете поток данных, который напрямую указывает, как должен выглядеть текст. Как и добросовестно выполняющий свою работу кондитер, принимающий заказы, текстовый редактор должен отслеживать ваши действия, чтобы убедиться: документ всегда соответствует вашим ожиданиям.