Журнал LinuxFormat - перейти на главную

LXF73:Интервью: Ричард Хипп

Материал из Linuxformat
Перейти к: навигация, поиск

Перфекционист

Если вы хоть раз слышали о движке SQLite для баз данных, и хотите внести свой вклад... то пожалуйста! Его автор, Ричард Хипп (Richard Hipp), горячо приветствует любые начинания. Он и объяснит, почему.


Изучение SQL и нормализации баз данных (БД) всегда были сложными темами для студентов, но знаете ли вы, как сложно создать собственную БД, подготовить ее для публикации, и наконец представить ее всему миру на критический анализ? Доктор Ричард Хипп сделал это, создав SQLite (произносится Эс-кью-элл-айт) – один из наиболее успешных проектов public domain. Нам удалось отловить Ричарда на конференции OSCon (Open Source Convention) и всесторонне обсудить с ним спонсорскую поддержку AOL, стандарты кодирования и жизнь в мире public domain.

LXF: Начнем с начала. Представим доктора Хиппа до изобретения им SQLite. Когда вы стали интересоваться базами данных?

РХ: когда я закончил университет и получил новенький диплом доктора философии (PhD, что в отечественной науке соотвествует кандидату наук, – прим.ред.) в 1992 году.

LXF: В области компьютерных наук, насколько я понимаю?

РХ: Да, я стал магистром в области радиоэлектроники и информатики. Во времена, когда я оканчивал университет, рынок был перенасыщен специалистами, которые хотели работать в образовательных учреждениях. На одну вакансию претендовало сразу 500 человек, 475 из которых были квалифицированнее меня. Поняв это, я решил организовать свой бизнес и заняться консалтинговыми услугами. Я распланировал для себя, как я буду работать с клиентами из года в год... у них будут сложные проблемы, а я буду разрабатывать для них решения, которые до меня еще никто не предлагал. Работая над подобными проблемами, я стал замечать, что организации, покупающие мои услуги, никогда не бывают монолитными, в каждой клиентской компании была своя структура, и однажды клиент настоял на внедрении базы данных. На тот момент у них уже была унаследованная БД Informix, работавшая на HP-UX. Informix неплохо работала и делала все, что от нее требовалось, но иногда компьютер приходилось выключать, а затем запускать снова, после чего БД могла нормально не заработать. В этот момент программа, над которой в том числе работал и я, выдавала сообщения об ошибках и не могла подключиться к базе данных. Из-за того, что я отвечал за пользовательский интерфейс, вину приписывали мне, несмотря на то, что эта была проблема сервера Informix! Мы собрались и решили, что «Если нам что-то и нужно, так это встроенный механизм БД SQL, который бы считывал данные из файла и не терял контакта с самой БД». Эта идея так и осталась тогда невоплощенной, но впоследствии, когда у меня не было работы, я как-то сказал себе: «Я возьмусь за это дело, обязательно возьмусь. Мне интересно то, как работает движок базы данных SQL, поэтому я напишу собственный вариант, ведь это лучший способ понять, как все на самом деле устроено». Так началась история SQLite.

LXF: Вот как вы в это ввязались...

РХ: Да, я не изучал теорию БД, у меня был ноль знаний в этой области. Однажды, копаясь в университетской библиотеке, я наткнулся на копию... стандарта SQL-89, кажется так, да... Я прочитал его и подумал: «Это, конечно, все здорово, но, по-моему, не имеет никакого отношения к тому, чем я сейчас занимаюсь». Десять лет спустя я вернулся к этому и оказалось, что род моих занятий несколько изменился и это самое «отношение» все же появилось.

LXF: Планировали ли вы сразу опубликовать первую версию? Не было ли вам страшно, или что-то в таком духе?

РХ: Нет, не было. Версия 1.0 использовала для хранения формат GDB, так, что на каждую таблицу или оглавление приходилось по отдельному файлу. Тогда еще не было транзакций, потому что GDB их не поддерживал. Я также не мог делать множество вещей, так как все тот же GDB базировался на хешировании и не предоставлял данные в упорядоченном виде, так что я не мог толком воспользоваться индексами. Мне действительно требовалась база данных на основе двоичных деревьев (B-tree). Я обратил внимание на BerkeleyDB и провел день или два за чтением документации, которой не было конца. После двух суток чтения я подумал: «Это действительно сложно», и решил, что напишу свое собственное хранилище. Итак, я достал с полки Каммингса и стал читать все, что там было относительно моей темы. Так появилась моя собственная реализация слоя b-tree и проект версии 2.0. Знаете, я ведь до сих пор учусь на своей работе, поэтому версия 2.0 была... в общем, я сделал много ошибок в первоначальном варианте, хотя потом все стало значительно лучше – где-то к версии 2.7. 2.8 была уже очень хороша. Вся система была, конечно, еще очень простой. Но этого было достаточно, чтобы ее заметили. К делу подключился PHP...

LXF: Тогда как раз была версия 2.8?

РХ: да, 2.8. Apple впервые заметила проект, когда тот был на версии 2.7 или 2.8. Множество людей стало им пользоваться. Потом ко мне проявила интерес AOL, которая хотела использовать SQLite в своих решениях. Они сказали: «Эй, Ричард, нам нужная многоязыковая поддержка и кое-какие другие функции». Я тогда готовил к выпуску версию 3.0 с исправлениями существовавших ошибок и ответил AOL: «Я все сделаю, мне лишь нужно время – около года, но кое-что будет уже в этом июне» – дело было в 2004 году. Тогда они сказали: «Давай мы тебе заплатим, а за это ты будешь согласовывать свой график с нами?». Я сказал «Хорошо» и назвал сумму.

LXF: И вы успевали в срок?

РХ: Ну, со мной тесно сотрудничал Дэн Кеннеди (Dan Kennedy). Дэн работал на одну компанию в Брисбене, которая использовала SQLite; он присылал мне исправления, которые были действительно очень хороши – он на самом деле хорошо работал – так что с его помощью мы вместе проделали за два месяца путь с нуля до версии 3.0 Мы писали базовую часть слоя b-tree, переделывали многие другие фрагменты, работали сутки напролет в течение двух месяцев, так как расписание есть расписание. Так появилась на свет версия 3.0.

LXF: SQlite 3.0 получилась совсем-совсем другой. Изменился формат файла – наверное потому, что вы переписали все с нуля, а AOL, очевидно оплачивала все расходы.

РХ: AOL позволила мне посвящать все мое время работе над SQLite, потому что мне ничего не надо было больше делать для обеспечения своего существования. Мне также удалось оплатить работу Дэна.

LXF: AOL до сих пор вас поддерживает?

РХ: Нет, это было только один раз. На самом деле, AOL даже не платила нам за поддержку, но поскольку нам все же выдавались деньги, на любой их звонок я должен был по первой команде прибегать и решать их проблемы. Технически, однако, тот контракт уже давно недействителен. Я стал понимать, что они довольны получившимся продуктом и продолжают им пользоваться, хотя мне и не совсем ясно, как именно.

LXF: Говоря о формате файлов, можно заметить, что он не сильно изменился по сравнению с версией 2.0. Было ли так необходимо переписывать слой b-tree?

РХ: Наверно, нет. Я всего лишь применил накопленные знания и получил то, что есть. Я хотел снять прежние жесткие ограничения. В старой версии можно было работать не более, чем с 16 Мб, теперь же это число составляет что-то вроде 264 Mb. На протяжении двух лет я набирался знаний и многому научился: «когда я перепишу слой b-tree, я сделаю его другим». Но я не мог просто накладывать изменения друг на друга, так как нужно было еще сохранить и совместимость. Я думал так: «когда я выпущу версию 3.0, я должен буду собрать все компоненты и заново их подогнать друг под друга». Таков был мой план.

LXF: Кажется удивительным, как Apple и PHP могли не дождаться версии 3.0, прежде, чем браться за SQLite...

РХ: Apple принялась за работу во времена версии 2.8, и только в Tiger (Mac OS X 10.4) появилась версия «три-точка-что-то-там». Они могли не торопиться, потому что время работало на них, чего нельзя сказать о PHP. Тем не менее, она все же вошла в раздел PDO в PHP (смотри учебник PHP на стр. 76)

LXF: Расскажите, как SQlite стала достоянием общественности (public domain)

РХ: Ну, версия 1.0 была лицензирована по GPL. По-другому было нельзя, так как GDB сам распространялся по этой лицензии. Когда на подходе была версия 2.0, я задумался: «какую же лицензию выбрать? Можно остановиться на LGPL, но в ней много запретов. Другой вариант – лицензия BSD или подобная». Но потом я задумался: «Почему именно лицензия BSD? Что она дает такого особенного? Что мне мешает сделать проект достоянием общественности и покончить с этой проблемой?» В случае с BSD, каждый может использовать проект как захочет, так же и я решил явно предоставить всем желающим свои наработки, отказаться от авторских прав. С тех пор ко мне успело обратиться много юристов. Они говорили: «Слушай, тут есть риск, кто-нибудь может подать на тебя в суд». Но я отношусь к этому скептически.

LXF: Ну да, это же достояние общественности!

РХ: Да, но я не чувствую себя уязвимым перед судом. допустим, какая-то корпорация взяла этот код, включила в свое приложение, это приложение что-то испортило, а отвечать мне? Как-то слишком за уши притянуто, даже для американского суда. Так что я особо не беспокоюсь.

LXF: Как же вы перешли от GPL к public domain? Или вы были единственным автором проекта?

РХ: Я был единственным автором и потому мог делать все, что считал нужным. В момент перехода к public domain, каждая строка кода была написана мной.

LXF: Насколько велик был проект в тот момент?

РХ: Наверное, 20 000 строк кода.

LXF: Скажите, а люди, которые участвуют в разработке SQlite и предлагают свой код, теперь должны что-нибудь подписывать?

РХ: Я предлагаю им заполнить форму, которая делает их наработки достоянием общественности. Они отказываются от использования своих прав в будущем. Этот подход основан на лицензии Creative Commons.

LXF: Много ли людей участвуют в разработке?

РХ: Две недели назад я открыл дерево разработки (CVS) и стал изучать, кто и сколько создает кода. Посчитав количество строчек, я выяснил, что 69% кода принадлежало мне, 30% - Дэну Кеннеди. Оставшийся 1% приходился, кажется, на шестерых прочих участников, из которых самый активный выдавал полпроцента кода. Так что в основном над проектом работаю я.

LXF: Может быть это потому, что public domain отпугивает людей?

РХ: От сотрудничества? Не знаю. Я вижу, как лицензия BSD вредит проекту OpenBSD. Вообще, по моему мнению, успех Linux и неудачи OpenBSD связаны с тем, что Linux распространяется на условиях GPL, и люди с уверенностью предлагают свой код, зная, что плоды их труда никто не сможет использовать неправомочно. Однако я считаю, что причиной такого малого числа участников SQLite является то, что я слишком придирчиво отношусь к коду, который идет в ядро. Дело во мне, а не в чем-то другом. Люди постоянно присылают мне исправления, и я действительно приветствую это, но у меня есть свои соображения по поводу того, как должен выглядеть код, как его надо комментировать, какие делать отступы... И дело даже не в оформлении, а в структуре. Множество людей присылают мне исправления и другие полезные вещи. Я это ценю, но все равно думаю: «Вы это не продумали, не попытались максимально упростить код, не переписывали его три-четыре раза...» Мне нравится писать настолько простой код, насколько это возможно.

LXF: Как раз об этом свойстве SQlite многие сейчас говорят. Это один из немногих открытых проектов, имеющих очень хорошую документацию, удобно размеченный и прокомментированный код. Можно взглянуть в любое место кода, и сразу все понять, – это в наше время кажется диковинкой.

РХ: Это и было моей целью...

LXF: Это как-то связано с тем, что ваш код является достоянием общественности? Я имею в виду, если бы он не был столь хорошо документирован, люди бы больше полагались на вас, а сейчас он живет сам по себе...

РХ: Люди не могут, да и не должны все время обращаться ко мне. да, это правда. Когда все начиналось, я не знал, является ли это решение здравым, но сейчас я в этом уверен.

LXF: Вы ведь всего лишь увлеченный программист, не так ли?

РХ: Причина того, что я так закапываюсь в код и настаиваю на том, чтобы он был хорошо прокомментирован, заключается в моей личной проблеме – у меня на удивление плохая память, и если я не разложу код по полочкам, через две недели я уже не буду помнить, что он делает! Еще мне было любопытно, как работают базы данных «изнутри». Я стал читать материалы о PostgreSQL и подобных вещах в Интернете и лишь через шесть или девять месяцев я действительно понял, как все это работает. Я хотел, чтобы любой, кто интересуется БД, мог взять мою программу, вчитаться в ее код и сказать: «Теперь я лучше понимаю, как должен работать движок БД».

LXF: Как раз одно из главных преимуществ свободного ПО – возможность программистов учиться друг у друга через исходный код.

РХ: Да, я стараюсь, чтобы комментарии приносили пользу. Если комментарий не удовлетворяет этому требованию, я думаю: «Что он здесь делает? Выкинуть его!»

LXF: Что нового появится в SQlite 4.0?

РХ: На самом деле, я надеюсь не добраться до версии 4.0. Переход к четвертой версии будет оправдан только в том случае, если потребуется сделать несовместимое изменение формата файлов.

LXF: Так что, через десять лет все еще будет ходить версия 3.9.9.9.6.3?

РХ: Не исключено. В данный момент я занимаюсь оптимизатором запросов. Его эффективность напрямую зависит от грамотного выбора индекса, и здесь есть над чем потрудиться. Традиционно это было слабой стороной SQLite. Если вы корректно написали запрос, он найдет то, что вам нужно, но не уделит достаточно времени его изучению и составлению наилучшего плана выполнения. Коммерческие клиент-серверные БД, напротив, тратят много времени на оптимизацию плана запроса. Эта деятельность финансируется одной компанией, поэтому я могу заниматься ею, не заботясь о своем пропитании. Как только я разберусь с оптимизацией запросов, я планирую заняться ссылочной целостностью. Я займусь этим по собственному желанию, мне не оплачивают эту работу.

LXF: Вы можете представить, что будете поддерживать SQL92, даже нет, давайте смотреть шире – SQL99?

РХ: Я не пытаюсь сделать из этого продукт. Я продаю услуги. Люди, которые обращаются ко мне за помощью, используют SQLite во встраиваемых устройствах. Их главные приоритеты – небольшой расход памяти и низкое энергопотребление. Так что я полностью сконцентрирован на решении этих проблем, так как эти люди – хорошие клиенты, они придут снова, и я хочу быть уверен, что у них все будет в порядке. Какой бы ни была последняя версия – SQL 99, 2003, она всегда будет съедать память и замедлять систему, поэтому я буду сопротивляться изо всех сил.

LXF: SQlite действительно работает очень-очень быстро. А еще она очень-очень маленькая. Если придется от чего-то отказываться, что вы выберете?

РХ: Я не знаю. Клиенты со встраиваемыми устройствами хотят и того, и другого сразу. «Быстрый» в данном случае означает «расходующий меньше энергии». Программа быстро делает свою работу и после этого перестает «висеть на шее» у аккумулятора. Маленький размер важен из-за того, что в таких устройствах каждый байт ОЗУ или Flash-памяти на счету. «Ричард, нельзя ли уменьшить загрузку памяти на 12 байт?» – «Конечно, почему бы и нет?»

LXF: По идее, объем памяти должен расти быстрее, чем емкость аккумуляторов...

РХ: Наверно, так. Но с ростом объема памяти SQLite пытаются запихнуть во все более крохотные устройства. Конечно, проблем с установкой БД в телеприставку не возникает, но если представить себе SQLite в мобильном телефоне, наручных часах или на смарт-карте (как раз этим сейчас все и занимаются), то мы снова возвращаемся к прежним проблемам.

LXF: Эта простота чувствуется и в том, как SQlite смотрит на вещи. Вы, к примеру, говорите ей: «Это целое, это длинное целое, а это – строка», а она вам в ответ: «Да какая разница…». Насколько я знаю, она многое игнорирует. Это так специально задумано, или вы собираетесь это исправить?

РХ: Так задумано. Я очень люблю это свойство программы, потому что большую часть клиентских задач я решаю в языках программирования сценариев, таких как Tcl/Tk, и там все работает по тому же принципу.

LXF: Давайте уточним: программа обрабатывает все как строки?

РХ: Версия 2.0 обрабатывала все как строку. Версия 3.0 различает целые, числа с плавающей точкой, строки и двоичные данные (тип BLOB), но она позволяет вам разместить все эти четыре типа в одной колонке таблицы (на разных строках). В традиционных БД SQL так делать нельзя: вы должны объявить тип данных для столбца, например, «short int», после чего сможете поместить в него только целые числа из определенного диапазона значений. В SQLite вы можете задать столбцу тип данных «short int» и поместить в него все, что считаете нужным.

LXF: Если вы можете разместить в числовом поле строку, то является ли оно числовым полем? Вот в чем вопрос.

РХ: Знаете, я думаю, что строгая типизация SQL есть ошибка в проектировании этого языка. Я уверен, что этот принцип изначально был заложен для того, чтобы авторы БД могли заранее определить, сколько дискового пространства будет занимать строка таблицы. Они не хотели пойти другим, более сложным путем: работать с записями переменной длины. Так что это, по сути, вопрос реализации..

LXF: ...пожалуй, это уже не актуально

РХ: Это база данных: она нужна для хранения информации, а не для того, чтобы вы занимались ее форматированием. Такова моя точка зрения. Справедливости ради, нужно сказать, что есть и другие. Однако я пришел из мира скриптовых языков, в которых очень ценится возможность поместить что угодно в какую угодно переменную.

LXF: В общем, так оно должно быть.

РХ: ко мне постоянно приходят люди и говорят: «Когда вы это исправите?» Но ведь здесь нет ошибки! Я думаю, что эти просьбы связаны с устоявшимися стереотипами, ведь SQL всегда делал это по другому, и сейчас, когда я расширил структуру языка, многие могут сказать: «Мы никогда не применяли этот способ, это не похоже на SQL»

LXF: Какую вы сами себе отводите роль в развитии SQlite?

РХ: Я хочу продолжать делать то, что делаю – то есть поддерживать проект. SQLite не требует серьезных усилий для поддержки, потому что не создает больших проблем. Я пытаюсь привлечь к этой работе новых людей, с тем, чтобы если на пути домой я попаду под автобус, кто-то занял бы мое место. Дэн Кеннеди более чем способен на все, что только может потребоваться сделать, он – что-то вроде моей «резервной копии». Но было бы лучше, если бы появилась группа людей, которая бы достаточно хорошо понимала код и могла уверенно исправлять ошибки.

LXF: Это и есть ваша нынешняя цель?

РХ: Я бы не отказался от помощи целой охапки Дэнов Кеннеди. Я знаю, что хочу слишком многого, ожидая прихода суперталантливых людей, потому что такие люди уже работают над другими проектами. Было бы здорово воспитать себе помощников и привлечь их к проекту. Знаете ли, мое имя нигде не встречается в исходном коде.

LXF: «Жалобы и предложения направляйте по адресу dan.kennedy@...»

РХ: Предоставление кода в public domain было большим шагом вперед. Это было похоже на свадьбу вашего первенца. Действительно, такое решение трудно принять, ведь я потратил столько времени и сил на свой проект, а потом отпустил его, даже специально перечитал код и удалил оттуда свое имя. Это больше, чем просто юридический шаг: я на самом деле выпустил свое детище на свободу. И продолжаю делать то же самое, то есть – отпускать его дальше. Возможно, это противоречит высказанному мною мнению по поводу того, кто может вносить свой вклад в код, но я так не считаю. Я не пытаюсь уберечь свой код, я оберегаю общий код.

Персональные инструменты
купить
подписаться
Яндекс.Метрика