Глава двадцать восьмая. Вы в полной...
2 декабря 2000 года, суббота
До вчерашнего дня лицензия нашей компании на программу FogBugz не позволяла ее «реконструировать» (reverse engineering), изучать исходный код или каким-либо образом его изменять. Некоторые пользователи честно спрашивали у нас, сколько стоит лицензия на исходный код, потому что хотели модифицировать некоторые функции.
Хм. А почему собственно лицензия запрещает трогать исходный текст? Я не смог найти для этого никаких обоснований. Наоборот, нашлось достаточно контраргументов, чтобы немедленно изменить лицензионное соглашение. Так что теперь сидите и слушайте стариковские воспоминания из моего прошлого опыта.
Давным-давно, в 1995 году я работал в Viacom, где наш маленький отряд отважных первопроходцев делал веб-сайты для разных хозяйств в составе Viacom.
В те дни серверы приложений еще не появились. Sybase была так глупа, что для обращения к ее БД в Интернете вы должны были заплатить 150 долларов за клиентскую лицензию для каждого пользователя, который подключается к вашему сайту. Вот-вот должен был выйти веб-сервер Netscape 1.0.
И тут бравая компания Illustra стала всюду рассказывать, что ее СУБД идеально подходит для Сети. Дело в том, что архитектура Illustra позволяла легко добавлять новые типы данных, для чего нужно было написать немного кода на С и скомпоновать его с их СУБД. (Любой программист, работавший с СУБД, почувствует здесь опасность. Код на С? Компонуемый
с СУБД? Ох...) Задумывалось это для поддержки таких экзотических типов данных, как широта/долгота, временные ряды и так далее. А потом возникла Сеть. Illustra написала нечто под названием Web Blade и скомпоновала его со своей БД. Web Blade была сырой системой, которая якобы позволяла извлекать данные из БД и создавать динамические страницы «на лету», что в 1995 году было для всех главной проблемой.
Один мой коллега работал над сайтом электронной торговли, посредством которого Blockbuster мог бы продавать через Интернет — не поверите — компакт-диски. Он решил, что Illustra превосходно подойдет для этой задачи. Однако Illustra стоила около 125 000 долларов — вытрясти такую кучу денег из Viacom было непросто и заняло немало времени. Коллега поставил у себя в кабинете бумажный стаканчик с надписью «В фонд Illustra» и таким образом собрал несколько долларов. Главный технолог вел мучительные и долгие переговоры с Illustra. В конце концов сделка была заключена. Мы инсталлировали Illustra и приступили к работе.
К несчастью, произошла катастрофа. Выяснилось, что Web Blade — мягко говоря, сырой и совершенно непригодный для работы продукт. Он падал каждые несколько минут. Когда он все-таки заработал, оказалось, что предлагаемый им единственный язык программирования совершенно уникален — этот язык не был полным по Тьюрингу, представляете? Менеджер лицензий постоянно отключал вас, и сайт молча умирал. Построение сайта на Web Blade стало сущим кошмаром для моего коллеги. Так что когда мне сказали, что я буду делать сайт для MTV, я взмолился:
— Только, пожалуйста, можно без Illustra?
— Хорошо, но чем ты это заменишь?
Никаких других серверов приложений в те дни не было. Не было ни PHP, ни AOLServer с TCL, Perl запускал по процессу на каждый запрос, пенициллина у нас тоже не было, и вообще жизнь была ужасна.
Моя репутация была поставлена на карту. И я подумал, что самым страшным в Illustra было то, что она регулярно падала, и с этим ничего нельзя было поделать. Будь у меня исходный код, размышлял я, аварийное завершение можно было бы отловить в отладчике и попытаться найти и устранить его причину. Возможно, придется неделю не спать ночами, отлаживая чужой код, но, по крайней мере, появляется шанс. А без исходного кода ты в полной ., как говорится.
Вот тогда я и получил один из главных уроков в области программной архитектуры: для наиболее ответственных, критических задач нужно использовать инструмент с более низким уровнем абстракции, чем это было бы в идеале. Например, если вы пишете крутую трехмерную стрелялку (такую как Quake, который вышел примерно тогда же) и хотите обойти конкурентов с помощью крутейшей трехмерной графики, не берите готовые графические библиотеки. Напишите собственную, потому что это фундамент вашей работы. Те, кто пользуется 3D-библиотеками, скажем, DirectX, делают это потому, что пытаются выделиться чем-то другим, а не качеством графики (может быть, сюжетом игры).
И тогда я решил больше не доверять никаким чужим долбаным серверам приложений и написать свой собственный, на С++, используя низкоуровневый API Netscape Server. Потому что, по крайней мере, тогда я знал бы, что если возникла проблема, то она в моем коде, и я в состоянии ее устранить.
И это одно из величайших достоинств программ с открытым кодом (open source) и бесплатных, даже если вы можете себе позволить отвалить 125 000 долларов за какую-нибудь Illustra: по крайней мере, если что-то не будет работать, вы как-то сможете это исправить, и вас не уволят с работы, и все эти замечательные-хотя-и-слишком-активные ребята из MTV не будут на вас коситься.
Собираясь проектировать систему, я должен выбрать инструменты. Хороший проектировщик применяет только те инструменты, которым можно доверять, или те, которые можно починить. «Доверять» не означает, что они произведены какой-нибудь крупной фирмой вроде IBM, которой положено доверять, — это значит, что в глубине души вы чувствуете, что они будут работать, как надо. Например, я знаю, что сегодня большинство Windows-программистов доверяет Visual C++. Они могут не доверять MFC, но MFC поставляется с исходным кодом, так что даже если этой библиотеке нельзя доверять, ее можно исправить, обнаружив, как ужасно реализованы асинхронные сокеты. Так что поставить свою карьеру на карту MFC все же можно.
Можно довериться СУБД Oracle, потому что она работает, и это всем известно. Вполне можно рассчитывать и на Berkeley DB, потому что если Berkeley DB напортачит, вы возьмете исходный код и исправите его. Но не стоит рисковать карьерой, используя не слишком известный инструмент с закрытым кодом. Можно экспериментировать, но помните о карьере.
Поэтому я стал думать, как сделать FogBugz беспроигрышной картой для трезвомыслящих инженеров. По счастливой случайности программа поставляется в виде исходного кода — так уж устроены сейчас страницы
ASP Но это меня не беспокоит. В программе отслеживания ошибок нет никаких чудес и алгоритмов, составляющих коммерческую тайну. Это не бог весть какие высокие технологии. (По правде говоря, в любой программе очень мало чудес и алгоритмов, составляющих коммерческую тайну. Тот факт, что довольно легко, дизассемблировав программу, разобраться, как она работает, не столь важен, как полагают специалисты по интеллектуальной собственности.) Меня не беспокоит, что люди читают мой код или модифицируют его для своих целей.
С модификацией исходного кода, который вы купили у производителя, связан другой риск: если производитель выпускает новую версию кода, вы можете потратить уйму времени, перенося в нее свои изменения. Здесь я тоже могу кое-чем помочь: если вы нашли ошибку и послали мне исправление, я включу его в следующую версию. Это делается с целью убедить людей, в том, что: а) FogBugz работает; б) если в программе обнаружится критически важная ошибка, они могут исправить ее и избежать увольнения, и в) если уж так случится, что им придется исправлять ошибки и исправления эти разумны, они попадут в код следующей версии, и жить станет легче.
И тут я уже слышу голоса поборников движения open source: «Осел! Сделай свою программу открытой — и все дела! У открытого кода таких проблем не бывает!» Замечательно. Только вот для существования моей крохотной компании с тремя программистами нужно 40 000 долларов в месяц. Так что мы берем деньги за свои программы, не извиняясь, потому что они того стоят. Мы не объявляем свои программы open source, но, заимствовав там два-три здоровых принципа, гарантируем, что выбор FogBugz становится надежным решением.