Моя первая проверка Билла Г
From The Joel on Software Translation Project
Автор: Джоэл Спольски
Вторник, 16 июня, 2006 г.
В оригинале статья называлась My First BillG Review.
Перевод быстрый, требует редактирования.
В старые времена в Excel'е был очень странный язык программирования без названия. Мы называли его «макросы Excel». Он был почти бесполезный без переменных (вам нужно было хранить значения в ячейках таблицы), без локальных переменных, без вызовов процедур: короче говоря, им было почти невозможно пользоваться. В нем были продвинутые возможности типа «Goto», но метки не были видны физически.
Единственное, что оправдывало его существование, это то, как он выглядел на фоне макросов Lotus, которые были не более чем набором символов, набранных длинной строкой в ячейке таблицы.
17 июня 1991 года я начал работать в Microsoft в команде Excel. Моя должность называлась «Program Manager» и мне было предложено найти решение этой проблемы. Подразумевалось, что решение будет как-то связано с языком программирования Basic.
Basic? Фу!
Я провёл некоторое время, общаясь с различными группами разработчиков. Visual Basic 1.0 только что вышел, и это было чертовски круто. Была неудачная разработка под кодовым названием MacroMan и ещё другая попытка сделать объектно-ориентированный Basic под кодовым названием «Silver». Команде Silver сказали, что у них есть один клиент для их продукта — Excel. Менеджер по маркетингу Silver Боб Уимэн, да тот самый Боб Уимэн, должен был продавать свою технологию только одному человеку — мне.
MacroMan, как я уже сказал, был неудачным, и после долгих обсуждений его в конце концов закрыли. Команда Excel убедила команду Basic в том, что в действительности нам нужно нечто вроде Visual Basic для Excel. Я проконтролировал, чтобы в Basic добавили четыре симпатичные возможности. Я заставил их добавить Variant, единый тип данных, в котором можно хранить данные любого другого типа, потому что иначе вы не смогли бы хранить содержимое ячейки в переменной без использования switch. Я потребовал добавить позднее связывание, которое стало известно как IDispatch или COM Automation, потому что Silver требовал глубокого понимания системы типов, а она совершенно не заботит людей, которые пишут макросы. Также я ввёл две синтаксические конструкции в язык: For Each, украденный из csh, и With, украденный из Паскаля.
Тогда я сел писать спецификацию на Excel Basic, толстенный документ, выросший до сотен страниц. Я думаю, там было 500 страниц, когда все было готово. ("Словесный понос", усмехаетесь вы; ладно, ладно, молчите уже...)
В те дни у нас были эти штуки под названием рецензии БиллГ. По существу любое существенное изменение фукнциональности проходило рецензию лично Билла Гейтса. Во время подготовки к проверке мне было сказано отправить копию моей спецификации в его офис. Это была, по сути, одна пачка бумаги, отпечатанной на лазерном принтере.
Я бросился печатать спецификацию и отправил её в его офис.
Позже в тот день у меня было немного времени, так что я начал выяснять, есть ли в Basic'е достаточно функций для работы с датами и временем, чтобы делать все те вещи, которые можно делать в Excel'е.
В большинстве современных сред программирования даты хранятся как вещественные числа. Целая часть этого числа — это количество дней с некоторой, заранее оговорённой, даты в прошлом, называемой началом эпохи. В Excel'е, сегодняшняя дата, 16 июня 2006 года, хранится как 38884, считая, что первый день — 1 января 1900 года.
Я начал прорабатывать разнообразные функции даты и времени в Basic'е и Excel'е, выясняя подробности, когда я заметил нечто странное в документации по Visual Basic: Basic использует 31 декабря 1899 в качестве начала эпохи, вместо 1 января 1900, но по какой-то причине, сегодняшняя дата представлена в Excel'е так же, как и в Basic'е.
Как так?
Я пошёл искать разработчика Excel'я, достаточно старого чтобы помнить такие вещи. Эд Фрис вроде бы знал ответ.
«А», — сказал он мне. — «Проверь-ка 28 февраля 1900 года».
«Это 59», — сказал я.
«Теперь проверь 1 марта».
«Это 61!»
«А что случилось с 60?», — спросил Эд.
«Это 29 февраля. 1900 — високосный год! Он делится на четыре!»
«Неплохой вариант, но нет тебе конфетки. Это не так», — сказал Эд и оставил меня на некоторое время в полном изумлении.
Тэк-с. Я провёл кое-какое исследование. Год, который делится на 100, не является високосным, если только он не делится при этом и на 400.
1900 не был високосным годом.
«Так это ошибка в Excel'е!», — воскликнул я.
«Вообще-то, не совсем», — сказал Эд. — «Нам пришлось это сделать, чтобы иметь возможность импортировать таблицы из Lotus 123».
«Тогда, это ошибка в Lotus 123?!»
«Да, но, наверное, вынужденная. Lotus должен был умещаться в 640 КБ памяти. А это не так уж и много. Если забыть про 1900, можно установить, что данный год високосный, всего лишь по двум нулевым крайним правым битам. Это действительно быстро и легко. Ребята из Lotus'а, похоже, решили, что ошибиться в тех двух месяцах далёкого прошлого не имеет значения. А ребята из Basic'а, похоже, напротив, были дотошными относительно тех двух месяцев, так что они сдвинули эпоху на один день назад».
«Ррррр!!», — прорычал я и удалился изучать, откуда в окошке параметров появился чекбокс «система дат 1904».
А на следующий день была большая проверка Билла Г.
30 июня 1992 года.
В те дни Майкрософт был гораздо меньше бюрократизирован. Вместо 11 или 12 уровней менеджмента, сколько у них сегодня, я отчитывался перед Майком Конте, который отчитывался перед Крисом Грэхэмом, который отчитывался перед Питом Хиггинсом, который отчитывался перед Майком Мэплсом, который отчитывался перед Биллом. Около 6 уровней от низа до верха. Мы ещё подшучивали над компаниями типа General Motors с их восьмислойным менеджментом, или что там у них было.
На моёй БиллГ-рецензии отчётная иерархия присутствовала в полном составе, вместе со своими кузинами, сёстрами и тётками, а ещё там был человек из моей команды, чьей единственной задачей на встрече был точный учёт того, сколько раз Билл произнесёт слово на букву F. Чем меньше количество слов «fuck», тем лучше.
Вошёл Билл.
Я подумал тогда, как это странно, что у него две ноги, две руки, одна голова и т. д., прямо, как у обыкновенного человека.
У него в руке была моя спецификация.
У него в руке была моя спецификация!
Он сел и обменялся какой-то шуточкой с управленцем, которого я не знал. Шуточки я не понял совершенно. Несколько людей засмеялись.
Билл повернулся ко мне.
Я заметил комментарии на полях моей спецификации. Он прочитал первую страницу!
Он прочитал первую страницу моей спецификации и написал заметки на полях!
Учитывая, что он получил от нас спецификацию около 24 часов назад, он должен был читать её прошлой ночью.
Он задавал вопросы. Я на них отвечал. Они были довольно простые, но черт меня раздери, если бы я их запомнил, потому что я не мог оторвать взгляд от того, как он листает спецификацию...
Он листал спецификацию! (Успокойся, ты маленькая девочка, что ли?)
...и ТАМ БЫЛИ ПОМЕТКИ НА ВСЕХ ПОЛЯХ. НА КАЖДОЙ СТРАНИЦЕ. ОН ПРОЧИТАЛ ВСЮ ЭТУ ЧЁРТОВУ СПЕЦИФИКАЦИЮ И НАПИСАЛ ЗАМЕТКИ НА ПОЛЯХ.
Он Прочитал Её Всю! [МАМОЧКИ РОДНЫЕЕЕЕЕЕ!]
Вопросы становились всё сложнее и более детализированными.
Они казались выбранными случайно. К этому времени я уже считал Билла приятелем. Он хороший парень! Он читал мою спецификацию! Он, наверное, всего лишь хочет задать несколько вопросов по своим заметкам на полях! Я открою баг в багтрэкере по каждому из его комментариев и лично проверю, чтобы они были адресованы кому нужно, pronto!
И вот, наконец, убойный вопрос.
«Я не знаю, ребята», сказал Билл, «кто-нибудь из вас уже действительно изучал в деталях, как всё это сделать? Ну, например, функции даты и времени. В Exel'е так много функций даты и времени. В Basic'е будут те же функции? Будут ли они работать так же?"
«Да», отвечаю я, «за исключением января и февраля 1900 года».
Тишина.
Счётчик факов и мой босс обменялись изумлёнными взглядами. Откуда я это узнал? Январь и февраль ЧЕГО-О?
«Окэй. Отлично, хорошая работа», сказал Билл. Он взял свою исписанную копию спецификации
... подождите! Я это хотел...
и вышел.
«Четыре», объявил счётчик факов; присутствовавшие зашумели: «круто, это меньше, чем я когда либо слышал. Билл становится добродушнее к старости». Ему было, знаете ли, 36 лет.
Позже мне объяснили. «Билл не хочет на самом деле делать ревизию твоей спецификации, он лишь хочет убедиться, что у тебя все под контролем. Его обычная манера —задавать все более сложные вопросы, пока ты не признаешь, что не можешь ответить, и тогда он сможет на тебя наорать, что ты не подготовлен. Никто точно не знал, что произойдёт, если кто-нибудь ответит на самый его сложный вопрос, потому что этого никогда раньше не случалось».
«Вы можете представить что было бы, если бы Джим Манци был на этой встрече?», кто-то спросил. «'Что ещё за функция даты?', спросил бы Манци».
Джим Манци был MBA-человеком, который довёл Lotus до ручки.
Это было хорошее замечание. Билл Гейтс был удивительно техничен. Он понимал и Variant'ы, и COM-объекты, и IDispatch и то, чем отличается Automation от vtables и почему это может привести к дуальному интерфейсу. Он беспокоился за функции даты и времени. Он не вмешивался в софт, если доверял людям, которые над ним работают, но вы не смогли бы обвести его вокруг пальца ни на минуту, потому что он был программистом. Настоящим программистом.
Смотреть, как непрограммисты управляют софтверными компаниям, это как смотреть на человека на сёрфе, не знающего как сёрфить.
«О, всё в порядке! У меня есть отличные советники, стоящие на берегу и рассказывающие мне что делать!», — скажут они и грохнутся с доски ещё и ещё раз. Стандартный лозунг MBA, который верит, что менеджмент — универсальная функция. Собирается ли Балмер стать очередным Джоном Скалли, который чуть не ликвидировал Apple, потому что совет директоров решил, что продажа Пепси — это хорошая подготовка для управления компьютерной компанией? Культ MBA, похоже, верит в то, что вы можете управлять организацией, которая делает вещи, которые вы не понимаете.
Сквозь года Microsoft росла, Билл перенапрягался, и некоторые сомнительно этичные решения привели к необходимости уделять много внимания менеджмента борьбе с правительством США. Тогда Стив взял роль CEO согласно теории, что это позволит Биллу тратить больше времени на то, что он делает хорошо, а именно на управление компанией, производящей софт. Но это, похоже, не решило проблем, обусловленных 11 уровнями менеджмента, культурой вечных, не прекращающихся встреч, упрямой настойчивости в создании любого возможного продукта, не важно какого (сколько миллиардов долларов потеряла Майкрософт, на R&D, антимонопольные штрафы, удар по репутации, потому что они решили, что они непременно должны не только сделать веб-браузер, но и отдавать его бесплатно?); и парочка декад небрежного, быстрого найма привели к тому, что интеллектуальные способности среднего сотрудника Майкрософта окончательно понизились (Дуглас Коупленд, в "Рабах Майкрософта": «Они наняли 3100 человек только в 1992-ом, и, вы знаете, не все они были жемчужинами».)
Ну ладно. Линия партии куда-то съехала. Excel Basic превратился в Microsoft Visual Basic for Applications for Microsoft Excel, с таким количеством ™ и ®, что я даже не знаю где их все расставлять. Я ушёл из компании в 1994-ом, полагая, что Билл совершенно забыл меня. Но лишь до тех пор, пока я не наткнулся на короткое интервью с ним в Wall Street Journal, в котором он упомянул, помимо прочего, что-то между строк на счёт того, как сложно было нанять, скажем, хорошего программ-менеджера для Excel. Они не растут на деревьях, или что-то типа того.
Может быть, он говорил обо мне? Ну…, наверное, это был кто-то другой.
Хотя…
