(Или как мы ваяли идеальное демо для самого богатого человека в мире)
На часах пять утра. И еще 5 часов остается до встречи с самим Биллом Г. Глаза у меня красные и припухшие. Я едва способен соображать: сутки без сна не прошли даром. Только что код перекомпилировался и, кажется, даже работает. Это значит, что следующие 2-3 часа я смогу проспать под столом, и у меня останется еще немного времени, чтобы показать демоверсию кода нашему менеджеру проекта. Следующим человеком, который ее увидит, будет Билл Гейтс. И это до чертиков меня пугает: от его мнения будет зависеть, получит ли наш проект финансирование.
В далеком 2001 году мне довелось поработать в Microsoft Natural Languages Group (NLG). Помимо прочего, NLG распоряжалась абсолютно всеми средствами проверки правописания и грамматики, входящими в состав Microsoft Office. Конкретно моя группа занималась разработкой продукта, который назывался «Контекстно-зависимая проверка орфографии». Мы отлавливали очень специфические ошибки, которые обычная проверка орфографии (красная волнистая линия) или синтаксиса (зеленая) могли пропустить. Представьте себе, что пишете письмо некоему Сэру Карлосу и ошибаетесь: «Дорогой сыр Карлос…». Выглядит глупо, не правда ли? При этом никаких ошибок нет: слово «сыр» есть в словаре. Наша программа умела отлавливать такие опечатки и ошибки, опираясь на контекст фразы. Цвет волнистой линии для таких ошибок — синий.
Встреча с Биллом Гейтсом была крайне важна: если бы нам удалось убедить его демкой, proof-of-concept, проект получил бы дальнейшее финансирование, а продукты MS Office — новый функционал. Презентовать что-то Гейтсу — это всегда задачка со звездочкой, но наши проблемы на этом не заканчивались. Дело в том, что для проекта мы подготовили одну специфическую DLL-библиотеку. По нашей задумке, она должна была работать «внутри» MS Word. Однако наш модуль еще не входил в состав текстового процессора, и демонстрацию предполагалось проводить где-то вовне самого Word. «Бедность не порок», подумали мы. И сделали демку целиком в командной строке: сначала вызывалась наша DLL-ка, затем прямо в консоли нужно было напечатать предложение, с ошибкой или без. Свой вердикт программа писала так же в консоли. Я чувствовал, что проекту не хватает визуальной яркости: вне MS Word он мог впечатлить только человека с богатым воображением.
Будучи инженером, я взялся решить проблему: невыразительная демонстрация хорошего продукта могла выйти боком и мне, и всему нашему отделу. А что если заставить наш код работать в отладочном билде Word’а? В теории это могло получиться. Загрузив на свой компьютер обширный исходный код Office, я собрал его, подменив «официальную» DLL-библиотеку своей, которая уже включала контекстуальный блок. Начался пошаговый дебаг. Долгие часы я копался в коде, пытаясь разобраться, каким образом вызывается DLL спеллера. По моему предположению, если оригинальная библиотека могла рисовать красные и зеленые линии, всё, что мне предстоит сделать — скопировать готовый код, сменить цвет подчеркивания и ассоциировать его с работой нашего модуля. Вопреки ожиданиям, Word «присылал» нашей библиотеке весьма запутанную структуру данных, которая, помимо собственно текста, содержала форматирование и громадный буфер для «отмены» через Ctrl+Z. Соответственно, чтобы пробраться к чистому тексту, нашему модулю пришлось анализировать все эти данные и отсекать лишнее. Проблема в том, что никакой документации на различные варианты этой структуры у меня не было. Пришлось вручную нарабатывать сценарии, в которых набор данных выглядит по-разному. Например, вот пользователь набирает текст. Что изменится в массиве, если одно слово будет выделено жирным, а другое — курсивом? Как отражается на данных изменение кегля, удаление слов и их замена. И всё это, на минуточку, с учетом буфера версий текста.
Много часов ушло у меня на то, чтобы понять, как это всё устроено и как заставить наш спеллер рисовать в Word’е правильные закорючки. Наконец, код заработал! Целых две минуты я был счастлив — а потом всё сломалось. За отладкой я провел остаток дня и больше половины следующего.
Такеши, мой друг, около 17 часов возвращался домой. По счастливой случайности он проходил мимо моего кабинета и заглянул поздороваться. Я показал ему новый вариант демки. Ранее Такеши участвовал в разработке MS Word и неплохо знал его кодовую базу. Демо заинтересовало Такеши, он сел рядом и бросился мне помогать.
Наверное, я в тот день написал самый уродливый код на C++, который когда-либо видел мир. Все было испещрено бесконечными if-else, обрабатывавшими разные варианты генерируемых Word’ом данных. Три часа мы провели за отладкой: смеялись, огрызались друг на друга, чесали в затылках, забыв обо всем на свете. Приблизительно раз в час жена Такеши звонила, чтобы справиться, когда он придет домой. «Скоро, скоро…» — отвечал ей мой друг, и мы продолжали работать.
Гордон, другой мой друг и по совместительству один из программистов NLG, пришел к нам около восьми часов вечера. Оба мы были совами и регулярно работали по ночам. В девяностые и начало нулевых никто не удивлялся, что коридоры Редмондского отделения Microsoft полны народа. К слову, Гордону моя затея расширить демонстрацию понравилась, и вот мы уже втроем сидели перед моим компьютером. Если его величество Word «падал», мы кричали и чертыхались. А любое верное срабатывание кода вызывало у нас гомерический смех.
Мы продолжали и продолжали. Да, это не был совместный оплачиваемый проект. Но страсть и желание показать самому крутому чуваку в мире (а заодно нашему большому боссу) эту маленькую фичу и преподать ее как можно красивее, подпитывали нас. Всё должно заработать не где-то в командной строке, а в реальном Word’е не позже 10 утра следующего дня. И мы продолжали кодить и пыхтеть.
В полночь мы заварили себе крепкого свежего кофе и отправились на поиски любой доступной в офисе еды. За ужином работа продолжилась: жена Такеши, видимо, потеряла надежду и перестала звонить после 22:00. Наверное, легла спать, счастливица. Мы с Гордоном тогда были холостяками, без детей и прочих обременений, поэтому нас совесть нисколечко не терзала.
Глаза наши налились кровью, как у быков на корриде, мы были одновременно измотаны и взведены до предела: всё должно было заработать вот-вот. Буквально через минуту!
К двум часам ночи нас покинул Такеши. Его
Лишь к 5 часам утра у нас с Гордоном получилось. Код работал! Я написал нашему менеджеру, чтобы рассказать о своей идее. Да-да, интеграция модуля напрямую в Word не была оговорена заранее. Это была моя личная инициатива.
Я скомпилировал финальную версию кода, переписал бинарники на дискету (представляете, на дискету!), положил ее на стол менеджера и, заведя будильник на 9:30, завалился спать прямо в кабинете.
Проснувшись, я осознал, что менеджер до сих пор не видел моего письма, а дискета с файлами сиротливо лежит у него на столе. Встреча с Гейтсом проходила в 9-м корпусе. Половину кампуса, отделявшую наши здания, я пробежал с дискетой в руках. Думаю, что, добравшись до дверей конференц-зала, я выглядел максимально жалко: с кругами под глазами, вспотевший, растрепанный. «ПОКАЖИТЕ ЕМУ ЭТИ БИНАРНИКИ!!!» — проговорил я заплетающимся языком, передавая дискету менеджеру за считанные минуты до того, как Гейтс вошел в зал. Менеджер оглядел меня со скепсисом, но решил довериться.
Ни до, ни после файлы не копировались с дискеты на жесткий диск так долго, как тем утром. Менеджер щелкнул по иконке Word: мне показалось, что между кликами мыши и запуском программы прошло никак не меньше вечности.
Заставка, пустой белый лист, мигающий курсор. Мы затаили дыхание: Джерри (наш PM) занес пальцы над клавиатурой. Напечатал пару предложений. Вот оно: наши крохотные синие закорючки. Код сработал! Можно было выдыхать…
Демка понравилась Биллу Гейтсу, и наш проект получил финансирование. Функция, над презентацией которой я корпел несколько дней, до сих пор присутствует в программе. Хотел бы я верить, что именно та марафонская ночь кодинга как-либо посодействовала успеху.
Моя коллега, Андреа Джесси, подарила мне свое крошечное воспоминание, которым я не могу не поделиться с вами: «Я присутствовала на той памятной презентации. Джерри напечатал тогда не случайный текст, а цитату из письма Билла Гейтса, которое было послано 100 000 сотрудников. Представляете, сколько человек его вычитывало перед отправкой? Вот именно. А ошибку нашла только программа. Гейтс тогда искренне рассмеялся!».
Почему я решил рассказать эту историю? Всё просто: она мне нравится. Отличный пример товарищества и взаимовыручки, которые процветали тогда в нашей компании. Два «посторонних» инженера, моих друга, всю ночь просидели со мной, расставляя брейкпоинты в Visual Studio и помогая отлаживать самый отвратительный код за всю историю Microsoft. И всё это только потому, что нам не хотелось довольствоваться посредственной демкой для Билла. Нам нужно было красивое демо, а не такое себе, «на троечку». Разумеется, ни строчки нашего кода не попало в продуктив.
Великая инженерия — это, в первую очередь, мастерство. А в настоящем мастерстве слишком маленьких мелочей никогда не бывает.
Автор:
omyhosts