Адам: Привет и добро пожаловать в CoRecursive. Я Адам Гордон Белл. В каждом эпизоде CoRecursive кто-то делится увлекательной историей создания собственного программного обеспечения.
Что произойдет, если сайд-проект, который вы делали по фану, вдруг станет популярным во всём мире? Как вы будете монетизировать его? Будете ли вы уделять ему всё своё время? Будете ли вы париться на счёт его обслуживания или просто оставите сервера включёнными и соберёте для них шкаф? У меня есть специальный гость, который ответит на эти и многие другие вопросы.
Ричард: Привет, я Ричард Хипп — разработчик SQLite.
Адам: СУБД SQLite вы можете встретить где угодно: в веб-браузере, в вашем телефоне, возможно, в вашей машине и даже в авиалайнерах. SQLite используют для хранения ваших сообщений в iMessages и WhatsApp. Попробуйте поискать на своём девайсе файлы с расширением .db, и вы удивитесь, насколько много баз данных SQLite окажется на борту.
Идея создать SQLite на самом деле пришла к Ричарду, когда он работал на проекте с госфинансированием. Он разрабатывал ПО для военного корабля и столкнулся с ограничениями СУБД Informix, которая в то время (это 2000-е) была установлена на нём.
Постановка задачи: спасение утопающих
Адам: Ричард был подрядчиком Bath Iron Works и работал над программным обеспечением для DDG-79 Oscar Austin. Это военный корабль, эскадренный миноносец, вооружённый до зубов.
Ричард: Вот представь: есть большой, сложный корабль, и там всё время что-то ломается. Допустим, лопнула труба. Необходимо изолировать это повреждение, закрыв клапаны с обоих концов трубы. Но тогда нужно открыть клапаны где-то в другом месте, чтобы восстановить уровень жидкости в других системах, находящихся ниже. Иначе они не будут работать. А для этого надо быстро найти все эти клапаны.
Это очень сложная задача, которая явно требовала автоматизации. Решить её могло помочь наше приложение Automated Common Diagrams, которое должно было сообщать команде: «О, вот в чём проблема. Вот клапаны, которые вы закрываете. Вот клапаны, которые вы открываете. Вот где они находятся».
Информация о том, где проложены все трубы и где расположены все клапаны, была в базе данных Informix. И руководство велело нам использовать тот софт, который уже был установлен на корабле.
NP-полная задача: остановись, программа!
Адам: Ричард уже в то время был известен тем, что умел решать сложные задачи. Поэтому ему и предложили эту работу.
Ричард: Если мы формализуем задачу, то получим ориентированный граф. Как известно, он является NP-полным. Парни пытались написать код, который решал бы эту задачу, но они не осознавали, что эта задача NP-полная:
«Вы знаете, мы не получаем решения. Программа просто работает вечно и тратит процессорное время. Что происходит?».
Они решали задачу без учёта NP-полноты. Тут нужно было использовать эвристику, которая находит быстрые приблизительные решения. За счёт ограничения точности ограничивается и время поиска решения (число циклов). И тогда программа не будет зависать.
Вы не можете написать для такой задачи наивный алгоритм и ожидать, что он быстро завершится. Вы застрянете в экспоненциальном поиске, перебирая каждую комбинацию клапанов, чтобы увидеть, какая из них даст вам лучшее решение.
Танцы с бубном вокруг СУБД: сервер, вставай!
Я возглавил команду и заставил её хорошо поработать над этим проектом, но СУБД Informix работала не очень хорошо. Время от времени сервер падал, и тогда наше приложение не запускалось. Это было неприятно. Появлялось диалоговое окно, в котором говорилось: «Не удаётся подключиться к серверу базы данных». И это была не наша вина. У нас не было никакого контроля над сервером базы данных. Но по итогу приложение не работало, а значит всех собак спускали на нас.
Адам: Ага. Я могу представить, когда какая-то труба лопается, они спешно открывают ваше приложение и… получают ошибку базы данных!
Ричард: Это военный корабль. Приложение должно работать, особенно в ситуациях, когда корабль получает боевой урон. В такие моменты лопается не одна труба, страдают разные части корабля. Люди бегают как сумасшедшие, и сквозь дым, кровь и хаос всплывает диалоговое окно с надписью: «Не удаётся подключиться к серверу базы данных». Это явно не то, что они хотят видеть перед смертью.
Что могут сделать разработчики с таким дефектом в предлагаемых обстоятельствах? Просто считывать данные в оперативную память. Просто загружать кучу данных в память, чтобы решить эту проблему.
В какой-то момент мы подумали: «А зачем нам вообще нужен сервер? Почему нельзя читать прямо с диска? Тогда у нас не будет зависимостей, которые могут привести к сбою работы приложения»
Я посмотрел по сторонам, но так и не нашёл баз данных SQL, которые бы позволили это реализовать. И тогда один из парней, с которыми я работал, сказал: «Ричард, почему бы тебе просто не написать [такую СУБД] самому?»
Я сделал это не сразу. Через некоторое время у проекта закончилось финансирование. Это было ещё в 2000-м году. И, если я правильно помню, у Ньюта Гингрича и Билла Клинтона был какой-то конфликт, поэтому все государственные контракты были закрыты. Я остался без работы на несколько месяцев и подумал: «Ну что ж, сейчас я просто напишу этот движок СУБД».
SQLite V1: когда сидишь без работы
Адам: Это был 2000 год. Википедии ещё не существовало. Люди для выхода в Интернет в основном использовали dial-up, и только 1% семей в США имел широкополосный интернет. Вы не могли просто ввести в Google запрос «как создать СУБД» и двигаться в заданном направлении. Но Ричард придумал собственный вариант реализации, основанный на его предыдущем опыте создания компиляторов.
Ричард: Если мы подумаем о каждом SQL-операторе как о программе, то нужно просто взять эту программу и скомпилировать её в своего рода исполняемый код. Я придумал структуру байт-кода, который фактически запускал запрос, а затем написал компилятор, который переводил SQL в этот байт-код. И вуаля: родилась СУБД SQLite.
На самом деле я так и не смог полноценно использовать её в том проекте, над которым тогда работал. Мы начали тестировать её, но заказчик настаивал на Informix. Хорошо, хозяин — барин. Мы использовали мой движок только для тестирования, но официально он никогда не был частью проекта.
Я выложил его в Интернет, и другие люди начали знакомиться с ним. Я помню, тогда, кажется, ещё было Твиттера, но на каком-то сетевом паблике кто-то разместил сообщение типа: «Вау, я нашёл базу данных SQL, которая завелась на моём Palm Pilot!».
Я не шучу. СУБД SQLite действительно вызвала резонанс, и это вдохновило меня на дальнейшую работу над ним.
Предложение от Motorola: как заработать на бесплатном ПО
Адам: Ричард продолжал заниматься своей СУБД в свободное от основной работы время, пока ему в один прекрасный день не позвонил представитель крупной корпорации.
Ричард: Это был звонок от Motorola. В начале 2000-х Motorola действительно была одним из технологических гигантов, наряду с AOL и Nokia. И только потом им на смену пришли Apple, Google, Microsoft и Facebook.
Итак, мне позвонили люди из Motorola и сказали: «Послушайте, мы разрабатываем новую операционную систему для сотовых телефонов и хотим, чтобы SQLite стал её частью. Вы можете реализовать это для нас?» Я очень обрадовался такому предложению и ответил: «О, конечно, конечно. Я могу сделать это для вас». И потом они сказали то, что заставило меня задуматься: «А сколько это будет стоить?». «Ну, послушайте, вот что я вам скажу, давай созвонимся завтра, и я вернусь к вам с прайсом», — вот что мне пришлось ответить на это.
Конечно, внутри я подумал: «Что? Можно зарабатывать деньги на программном обеспечении с открытым исходным кодом? Как это работает? Как мне установить цену? Я понятия не имел, как это сделать». Я долго возился, но придумал какую-то схему ценообразования. Они хотели доработать SQLite, чтобы он мог быть установлен в их телефонах, и я выставил им немалую цену за это. В то время я думал, что это целое состояние.
Адам: Какая это была сумма? Можешь рассказать?
Ричард: Насколько помню, 80 000 долларов или что-то в этом роде. По сегодняшним меркам это не очень большие деньги, но тогда для меня это было очень много. Чтобы заниматься этим проектом, я пригласил троих парней с работы. Это было своего рода началом.
Сотрудничество с AOL: невольный обман
Адам: Следующим технологическим гигантом, который обратился к Ричарду, был AOL (America Online). Они пригласили его в свой офис обсудить контракт на доработку SQLite под свои нужды.
Ричард: Это было ещё тогда, когда AOL была ведущим поставщиком услуг в мире. Может, ты слишком молод, чтобы помнить это, Адам. Раньше мы получали по почте…
Адам: Компакт-диски…
Ричард: Да, диски по почте. Да, CD, за 10 долларов в месяц. Им нужно было хранить базу данных на этом компакт-диске, но свободное пространство было сильно ограничено. Они хотели использовать для этого SQLite.
Я придумал, как мне показалось, крутую фичу с временным индексом для реальной таблицы, которая могла быть разделена между процессами. Я уже сидел в офисе, рассказывая им об этом, и в середине предложения, когда я готовился объяснить, что это за временный индекс… споткнулся. Мне внезапно пришла в голову важная мысль: если у вас есть временный индекс, тогда только один из пользователей базы данных видит этот индекс. И если другой пользователь обновит эту таблицу, индекс устареет. Я сидел в их офисе, там было несколько человек, они собирались нанять меня. Я собирался похвастаться им этой новой идеей, и вот мне внезапно пришло в голову, что она принципиально неработоспособна…
В середине предложения мне пришлось на ходу придумать другое объяснение.
[Рассказать подробности он, видимо, не может из-за этики или каких-то соглашений — прим. редактора]
Адам: Круто, чё (улыбается).
Symbian OS и Nokia: День Благодарения
Адам: Так обычно и делаются такие предложения? Они тоже просили вас прийти к ним в офис [в Лондон]?
Ричард: Да, вот как это произошло. Одним из первых крупных клиентов, которые действительно обеспечили нас большим объёмом работы, была Symbian. Symbian OS в то время стояла на телефонах Nokia.
Они позвонили мне и попросили прилететь в их штаб-квартиру в Лондоне на разговор. Встреча по датам совпадала с Днём Благодарения. Они этого не знали. Я не стал возражать, потому что в Великобритании не празднуют День Благодарения. В Канаде, по-моему, тоже нет.
Адам: Есть. Но у нас это другой день.
Ричард: Хорошо. Итак, я должен был лететь в Лондон в День Благодарения. Но мы уже много лет отмечаем этот праздник с многочисленными родственниками моей жены. И вот в этот раз она пришла без меня… Чтобы кузены и прочие родственники не думали «Ой, наверное, у них что-то не так...», ей пришлось с порога объяснять: «Ричард в Лондоне на очень важной деловой встрече.
Короче, им нужен был движок базы данных для Symbian OS. Они устроили большой конкурс, и получили много откликов. Они сравнивали 10 различных движков баз данных — два других продукта с открытым исходным кодом и семь проприетарных. Их тестировали на одном наборе данных, чтобы увидеть, какой лучше всего соответствует потребностям компании. И SQLite победил.
Остальным девяти они дали возможность немного кастомизировать свои движки, но мы всё равно победили. Кто знал, что так будет? Они подлетели ко мне и сказали: «Это здорово. Мы хотим его, но нам нужны доработки». Я сказал: «Отлично», и мы заключили контракт на выполнение доработок.
Создание консорциума: «Вы всё делаете неправильно»
Ричард: В один прекрасный день наши партнёры пришли к нам и сказали: «Послушайте, нам нужно, чтобы вы уменьшили влияние фактора автобуса». Количественная характеристика фактора автобуса — это число людей, которых должен сбить автобус, чтобы остановить всю разработку проекта. В проекте SQLite таких людей было слишком мало...
Они хотели, чтобы мы основали консорциум для SQLite. Это один из эффективных способов привлечения финансирования и большего числа разработчиков. Создание консорциума позволяет гарантировать, что проект будет функционировать в долгосрочной перспективе.
Мы начали это большое дело, и я придумал кучу идей. Это было безумие: изначально все члены Консорциума должны были иметь право голоса. Начали распространяться слухи.
Честно говоря, я не знаю, как это случилось, но Митчелл Бейкер, женщина, которая руководит Mozilla Foundation, узнала о решении создать консорциум и позвонила мне: «Ричард, вы всё делаете неправильно. Позвольте мне рассказать вам, как создать консорциум. Разработчики должны держать всё под контролем. Их решение окончательное. Это не обсуждается. Компании-партнёры получают привилегию вносить деньги, но все решения принимаете вы».
Она рассказала всё и была непреклонна по каждому пункту. Она знала своё дело, она — юрист.
Я спросил: «Как заставить людей присоединиться? Какой стимул им дать?»
«Не беспокойтесь об этом. Они присоединятся. Если вы это сделаете, Mozilla станет одним из основателей», — ответила она. И, конечно же, мы получили поддержку от Mozilla, Symbian и Adobe. Нам очень повезло, что это произошло… Как я уже сказал, я ни на что не рассчитывал. Когда Symbian сказал: «О, вам нужен консорциум», я не знал, что делать. Не знаю, как Митчелл Бейкер узнала об этом и решилась позвонить мне и сказать: «Вы всё делаете неправильно».
Я не знаю, как это произошло, но это произошло. Это было такое удивительное приключение. Мы не оказались бы в такой ситуации, если бы не это удачное стечение обстоятельств.
Продолжение следует…
Во второй части интервью вы узнаете:
- почему Ричард считает себя причастным к провалу Motorola и Nokia;
- к каким проблемам привело масштабирование СУБД SQLite;
- сколько тест-кейсов нужно, чтобы обеспечить ей 100-процентное покрытие;
- о том, как Ричард добавил покрывающие индексы в SQLite;
- почему и как Ричард разрабатывает собственную систему контроля версий;
- какие советы он может дать младшим коллегам.
Аренда облачного сервера с быстрыми NVMе-дисками и посуточной оплатой у хостинга Маклауд.