[Перевод] Ночной марафон, на который я решился ради Билла Гейтса

(Или как мы ваяли идеальное демо для самого богатого человека в мире)

Билл Гейтс приблизительно в 2001 годуБилл Гейтс приблизительно в 2001 году

На часах пять утра. И еще 5 часов остается до встречи с самим Биллом Г. Глаза у меня красные и припухшие. Я едва способен соображать: сутки без сна не прошли даром. Только что код перекомпилировался и, кажется, даже работает. Это значит, что следующие 2–3 часа я смогу проспать под столом, и у меня останется еще немного времени, чтобы показать демоверсию кода нашему менеджеру проекта. Следующим человеком, который ее увидит, будет Билл Гейтс. И это до чертиков меня пугает: от его мнения будет зависеть, получит ли наш проект финансирование.

В далеком 2001 году мне довелось поработать в Microsoft Natural Languages ​​Group (NLG). Помимо прочего, NLG распоряжалась абсолютно всеми средствами проверки правописания и грамматики, входящими в состав Microsoft Office. Конкретно моя группа занималась разработкой продукта, который назывался «Контекстно-зависимая проверка орфографии». Мы отлавливали очень специфические ошибки, которые обычная проверка орфографии (красная волнистая линия) или синтаксиса (зеленая) могли пропустить. Представьте себе, что пишете письмо некоему Сэру Карлосу и ошибаетесь: «Дорогой сыр Карлос…». Выглядит глупо, не правда ли? При этом никаких ошибок нет: слово «сыр» есть в словаре. Наша программа умела отлавливать такие опечатки и ошибки, опираясь на контекст фразы. Цвет волнистой линии для таких ошибок — синий.

Пример отсюда: https://edu.gcfglobal.org/en/word2010/checking-spelling-and-grammar/1/Пример отсюда: https://edu.gcfglobal.org/en/word2010/checking-spelling-and-grammar/1/

Встреча с Биллом Гейтсом была крайне важна: если бы нам удалось убедить его демкой, proof-of-concept, проект получил бы дальнейшее финансирование, а продукты MS Office — новый функционал. Презентовать что-то Гейтсу — это всегда задачка со звездочкой, но наши проблемы на этом не заканчивались. Дело в том, что для проекта мы подготовили одну специфическую DLL-библиотеку. По нашей задумке, она должна была работать «внутри» MS Word. Однако наш модуль еще не входил в состав текстового процессора, и демонстрацию предполагалось проводить где-то вовне самого Word. «Бедность не порок», подумали мы. И сделали демку целиком в командной строке: сначала вызывалась наша DLL-ка, затем прямо в консоли нужно было напечатать предложение, с ошибкой или без. Свой вердикт программа писала так же в консоли. Я чувствовал, что проекту не хватает визуальной яркости: вне MS Word он мог впечатлить только человека с богатым воображением.

Будучи инженером, я взялся решить проблему: невыразительная демонстрация хорошего продукта могла выйти боком и мне, и всему нашему отделу. А что если заставить наш код работать в отладочном билде Word«а? В теории это могло получиться. Загрузив на свой компьютер обширный исходный код Office, я собрал его, подменив «официальную» DLL-библиотеку своей, которая уже включала контекстуальный блок. Начался пошаговый дебаг. Долгие часы я копался в коде, пытаясь разобраться, каким образом вызывается DLL спеллера. По моему предположению, если оригинальная библиотека могла рисовать красные и зеленые линии, всё, что мне предстоит сделать — скопировать готовый код, сменить цвет подчеркивания и ассоциировать его с работой нашего модуля. Вопреки ожиданиям, Word «присылал» нашей библиотеке весьма запутанную структуру данных, которая, помимо собственно текста, содержала форматирование и громадный буфер для «отмены» через Ctrl+Z. Соответственно, чтобы пробраться к чистому тексту, нашему модулю пришлось анализировать все эти данные и отсекать лишнее. Проблема в том, что никакой документации на различные варианты этой структуры у меня не было. Пришлось вручную нарабатывать сценарии, в которых набор данных выглядит по-разному. Например, вот пользователь набирает текст. Что изменится в массиве, если одно слово будет выделено жирным, а другое — курсивом? Как отражается на данных изменение кегля, удаление слов и их замена. И всё это, на минуточку, с учетом буфера версий текста.

Много часов ушло у меня на то, чтобы понять, как это всё устроено и как заставить наш спеллер рисовать в Word«е правильные закорючки. Наконец, код заработал! Целых две минуты я был счастлив —, а потом всё сломалось. За отладкой я провел остаток дня и больше половины следующего.

Немного SWAG'а, сохранившегося с тех временНемного SWAG’а, сохранившегося с тех времен

Такеши, мой друг, около 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. И всё это только потому, что нам не хотелось довольствоваться посредственной демкой для Билла. Нам нужно было красивое демо, а не такое себе, «на троечку». Разумеется, ни строчки нашего кода не попало в продуктив.

Великая инженерия — это, в первую очередь, мастерство. А в настоящем мастерстве слишком маленьких мелочей никогда не бывает.

© Habrahabr.ru