(Или как мы ваяли идеальное демо для самого богатого человека в мире)
На часах пять утра. И еще 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. И всё это только потому, что нам не хотелось довольствоваться посредственной демкой для Билла. Нам нужно было красивое демо, а не такое себе, «на троечку». Разумеется, ни строчки нашего кода не попало в продуктив.
Великая инженерия — это, в первую очередь, мастерство. А в настоящем мастерстве слишком маленьких мелочей никогда не бывает.
Комментарии (24)
Gengenid
12.11.2021 20:31+4Я вот помню в Word 97 была интегрирована система проверки орфографии ОРФО и это было круто. Как спустя 15 лет проверка орфографии стала хуже - это надо у Microsoft спросить.
csdoc
12.11.2021 21:56+1Проверку орфографии ОРФО и сейчас можно прикрутить к ворду, - https://orfo.ru/
Спустя 15 лет проверка орфографии стала хуже потому что в Microsoft отказались от ОРФО и сделали в новых версиях ворда что-то свое, не такое качественное как ОРФО.
Gengenid
12.11.2021 22:17Я это знаю. Я не понимаю, как можно было убрать что-то настолько полезное и нужное, не создав (купив) свое такое же.
Хуже только то, что они с макросами сотворили.
khim
13.11.2021 01:34+3Я не понимаю, как можно было убрать что-то настолько полезное и нужное, не создав (купив) свое такое же.
А что — офис после этого стали меньше покупать? А если нет — зачем тратить деньги на что-то, что не приносит прибыли?
NeoCode
12.11.2021 23:24+8Читал статью и сразу подумал: а почему нельзя было просто взять стандартный пример с RichEdit'ом из MFC и встроить туда демку? Собственно Word же здесь не нужен, нужна просто наглядная визуальная демонстрация нового типа проверки орфографии.
Deenamo
14.11.2021 22:27+2Это была бы полумера, недалеко отошедшая от демонстрации работы библиотеки в командной строчке (Гейтс бы понял).
Программисту хотелось сделать полный proof of concept / MVP.
vkni
12.11.2021 23:49+5Вообще говоря, Билл Гейтс вроде бы не дурак. И должен обладать некоторым воображением.
petropavel
13.11.2021 00:54+15Отличный пример товарищества и взаимовыручки, которые процветали тогда в нашей компании.
Я б сказал, отличный пример отсутствия коммуникации между отделами. Одна команда в Microsoft разрабатывает супер-спеллчекер (назовём его так) для Microsoft Word-а и несколько дней реверсит как этот Word вызывает свой спеллчекер. А нельзя было просто спросить? Тупо позвонить или зайти или хоть email написать в комнату на соседнем этаже и спросить?
tmin10
13.11.2021 11:24Также видно отсутствие внуренней базы знаний с документацией. На текущем проекте можно без проблем поискать в конфлюенсе и найти то, что делают другие команды.
lymes
13.11.2021 12:46+7В больших компаниях это нормально когда левая рука не знает что делает правая. У них была всего ночь, они нашли одного коллегу, который знал код ворда и согласился помочь, и это уже дофига. "Спросить" и "мэйл написать" - ответят, но на другой день, а могут и не ответить. "Соседний этаж" может оказаться в другом городе.
petropavel
13.11.2021 13:42+1Не ночь, он провёл за этим «много часов», потом «остаток дня и больше половины следующего», и потом ещё всю ночь. И, на минуточку, он писал не какой-то пасьянс, он работал в группе, которая «распоряжалась абсолютно всеми средствами проверки правописания и грамматики, входящими в состав Microsoft Office», они вообще должны были очень плотно с вордовщиками общаться. По уму, он бы хорошо знал конкретного человека, который отвечает за старый спеллчекер.
Но вообще-то, конечно, в большой компании это не очень удивительно. Но всё равно плохо же, что статья и показывает.
MichaelBorisov
15.11.2021 01:13+1Да даже и в маленьких компаниях это было бы нормально.
Представьте: вы на своем месте, делаете проект, поставлены сроки. И тут приходит товарищ из другого отдела и говорит: «помоги, забрось свои дела и поработай недельку на меня». Одно дело — ответить на вопрос; подсказать, где найти информацию или человека. Час-два даже потратить не жалко, риск сорвать свои сроки от этого невелик. Но неделю потратить на идею, спонтанно пришедшую коллеге в голову, и несогласованную с руководством — чревато.
Вы бы стали так поступать?
dartraiden
13.11.2021 18:37пример отсутствия коммуникации между отделами
К слову, за прошедшие десятилетия ничего не изменилосьЕсть такая политика «Выключить Microsoft Defender». Она не работает вообще. Там, вообще-то, в описании указано, что её лучше не трогать, иначе будет «неподдерживаемое поведение». По факту, она работает лишь в серверных изданиях, но не в клиентских. И об этом написано…
1) в документации по файлу ответов (логичнее было это написать в описании политики в редакторе политик, а не где-то в недрах документации, к тому же, мало относящейся к сабжу?)
2) указано, что этот ключ реестра не работает в версиях до 1903 (то есть, в более новых должен работать?)
На самом деле, дело обстоит так (насколько вообще можно толковать косноязычных технических писателей из Microsoft): в 1903 появился Tamper Protection (блокировка Защитником попыток изменить критические для себя настройки иными способами, кроме как через собственный GUI), а политику сделали нерабочей. Но в версиях до 1903 тампера не было, так что политику выпилили рестроспективно и из старых версий десятки тоже (которые тогда ещё поддерживались). Отсюда фраза про то, что не работает в версиях до 1903. Почему не написали в редакторе политик? А потому что за него отвечают другие люди, вовсе не те, кто внедрял тампер. Внедрявшие тампер вообще не видели смысла документировать изменения, связанные с его внедрением. Им об этом пользователи писали в комментариях к анонсу тампера в их блоге, где состоялся примерно такой разговор:
— Напишите доки, что теперь политика не будет работать
— Мы готовы созвониться с вами, чтобы узнать, зачем вы отключаете антивирусную защиту
В итоге они вот это высрали куда-то в документацию, лежащую на самой нижней полке закрытого шкафа, засунутого в бывшую уборную, на двери которой висит знак «Осторожно, леопард». Потому что проще было сделать так, чем эскалировать вопрос на пару уровней вверх, затем вбок и на несколько уровней вниз, в группу, занимающуюся описанием политик
Deenamo
14.11.2021 22:33+2Это был Microsoft времен Стива Боллмера, который характеризуется вот такой картинкой (автор сам на это ссылается в других статьях)
Organizational charts
korsarer
15.11.2021 01:56-2Да, вы молодцы, что поработали. Только вот жаль, что на великий могучий ваша программа не распространяется. Или она не слышала про страшные -ТСЯ и -ТЬСЯ?
MAXH0
Омерзительное идолопоклонничество... А красноглазие от того, чсто хотел понравиться боссу - ИМХО - самая патологическая форма красноглазия...
Politura
Красноглазие от того, что так сильно втянулся в проект, что жаждешь его завершить и очень не хочешь чтоб его прекратили - единственно верная форма красноглазия.
MAXH0
Наверное, у работающих на больших боссов развивается стокгольмский синдром. Ведь на самом деле успех или не успех проекта зависит от пользователей... А не от того улыбнулся ли босс, глядя на свою ошибку.
Johnneek
Ну, частенько от босса зависит стартовое финансирование проекта, а без этого финансирования потенциальные пользователи даже не узнают о проекте.
osipov_dv
проекты держаться не людях болеющих за то, что они делают. без них все скатится в уг...
Что плохого, в том что люди хотят показать свою работу с максимально хорошей стороны, и не соглашаются на средненькую презентацию? Сделать лучше чем от тебя ожидают, это лучшее что можно ожидать от любого специалиста.
Deenamo
Автор много рефлексирует в своем блоге на тему ранних лет своей карьеры в Microsoft середины-конца 90х.
Тогда он был молодым специалистом, недавним выпускником, еще без семьи, к тому же – стал миллионером (на бумаге) за первые пару лет работы во время безудержного роста акций, который вскоре прекратился (после дот-ком краха и 9/11).
В общем, глаза горели.