Я проанализировал один из успешных проектов открытой разработки – fetchmail, который я использовал, чтобы проверить некоторые теоретические соображения о разработке программного обеспечения, возникшие из истории Linux'a. Я обсуждаю эти соображения с позиций двух совершенно разных стилей разработки: модели «собора», распространенной в коммерческом мире, или модели «базара», предложенной в мире Linux'a. Я показал, что эти модели происходят от разного подхода к задаче отладки программ.
1. Собор и Базар
Linux – удивительная система. Кто бы мог подумать, что несколько тысяч разработчиков, разбросанных по всей планете и сотрудничающих только через Интернет, смогут создать операционную систему мирового класса. Я во всяком случае так не думал. К тому времени как Linux оказалась в поле моего зрения в начале 1993 года, я уже около десяти лет участвовал в разработке UNIX'a и открытых программ. Я был одним из первых участников GNU в середине 80-х. Я был автором многих открытых программ, и в частности участвовал в разработке nethack, Emacs VC и GUD modes, xlife, которые широко используются и по сей день. Я думал, что я знаю, как это делается.
Linux перевернула мои представления о том, что я знаю. Я считал, что основным в разработке небольших инструментов для UNIX'a является их быстрое проектирование и эволюционирующее программирование в течение многих лет. И в то же время я верил, что по мере того как сложность разработки увеличивается, необходим более централизованный подход. Я верил, что разработка самого сложного программного обеспечения (например, операционных систем или просто больших инструментов, таких как Emacs) должна быть подобна строительству собора. Такие программы должны создаваться мастерами-индивидуалистами или небольшими группами волшебников, работающими в строгой изоляции, не допуская преждевременных бета-версий.
Меня очень удивил стиль разработки Линуса Торвальдса – частый выпуск релизов, доступность всех исходных текстов и терпимость к разнородным программам. Это совсем непохоже на размеренное строительство собора, сообщество Linux скорее напоминает шумный базар, с множеством различных подходов и направлений. То, что на этом базаре рождается согласованная стабильная операционная система, кажется чудом из чудес.
Меня потрясло, что этот базарный стиль работает и работает хорошо. Я не только участвовал в разработке индивидуальных проектов, но также пытался понять, почему в мире Linux'a не только не возникает беспорядка, но напротив он движется вперед со скоростью, которой строители собора могут только позавидовать.
К середине 1996 года мне показалось, что я начал понимать. Судьба предоставила мне прекрасный шанс проверить мою теорию. Это был проект разработки открытого пгораммного обеспечения, который я сознательно провел в базарном стиле. Успех этого проекта превзошел все ожидания.
В этой статье я расскажу вам историю этого проекта, и на его примере покажу несколько правил эффективной разработки свободного программного обеспечения.
Не все эти приемы я узнал из мира Linux'a, но если я прав, они помогут понять, почему сообщество Linux'a производит столько полезных программ и помогут вам повысить производительность.
2. Проблемы с пересылкой почты
C 1993 года я занимался решением технических проблем небольшого свободно доступного ISP, который назывался Chester Counter InterLink (CCIL). Я был одним из основателей CCIL и написал свою собственную BBS (вы можете проверить это, сделав telnet на locke.ccil.org). Сегодня он поддерживает почти три тысячи пользователей на девятнадцати линиях. Благодаря этой работе, я имел неограниченный доступ к Internet через линию 56K! Итак, мне пришлось использовать почту Internet. По некоторым причинам мне было сложно соединить CCIL и мою домашнюю машину по протоколу SLIP. В конце концов, когда мне это удалось, оказалось, что очень неудобно делать telnet для проверки своей почты. Я хотел, чтобы когда почта приходила на snark, я получал об этом сообщение и мог бы обрабатывать ее локальными инструментами.
Простой sendmail мне помочь не мог, потому что моя домашняя машина не всегда находится в сети и не имеет статического IP адреса. Мне нужна была программа, которая бы через SLIP соединие забирала мою почту. Я знал, что такие вещи существуют, и большинство из них использует простой протокол POP (Post Office Protocol). К тому же в операционную систему BSD/OS на locke был включен POP3 сервер.
Мне нужен был POP3 клиент. Одну такую программу я нашел через сеть (на самом деле я нашел три или четыре). Некоторое время я использовал pop-perl, но в нем отсутствовала одна необходимая возможность: он не умел выбирать адреса так, чтобы можно было правильно отвечать на письма.
Проблема заключалась в следующем. Допустим, что кто-то по имени 'joe' прислал мне на locke письмо. Если я пытался ответить на него, после того как забрал его на snark, мой mailer пытался адресовать ее несуществующему joe на snark. Исправлять вручную '@ccil.org' было утомительно.
Нужные мне возможности были очевидны, но ни один из существующих POP клиентов не знал как это сделать. Это приводит нас к первому уроку:
1. Все хорошие программы появляются для личных нужд разработчиков.
Необходимость – мать изобретения. Слишком часто программисты работают над программами, из которых они не могут извлечь ни пользы ни удовольствия – ничего кроме денег. Но в мире Linux – все по-другому, и это объясняет высокое качество программ для Linux.
Вы думаете, я тут же начал разрабатывать свой POP3 клиент, соревнуясь с уже имеющимися? Ни в коем случае! Я внимательно осмотрел все POP утилиты, которые были у меня под рукой, и спросил себя, которая из них наиболее соответствует моим требованиям. Потому что
2. Хорошие программисты знают, что можно написать; а великие знают, что можно переписать.
Я не претендовал на великого программиста, а попытался его имитировать.
Характерная черта великих – это их лень. Они знают, что судят не по усилиям, а по результатам. Почти всегда легче начать с чего-то сделанного, чем с нуля.
Линус Торвальдс, например, не пытался написать свою систему с нуля. Он начал использовать идеи и исходники от Minix, небольшой UNIX-подобной системы для 386 машин. Почти весь исходный текст Minix был переписан, однако, он послужил основой для того что позже стало Linux'ом.
Действуя в том же духе, я начал искать существующую POP утилиту, чтобы использовать ее как основу для разработки.
В мире UNIX'a всегда существовала традиция делать исходные тексты открытыми и дружественными к повторному использованию кода. Именно поэтому проект GNU выбрал UNIX как основную операционную систему. Мир Linux'a полностью перенял эту традицию. Здесь вы можете найти терабайты исходных текстов, и поэтому шансов найти что-нибудь подходящее в мире Linux'a выше, чем где бы то ни было.
Мне это подошло. Вместе с теми программами, которые я нашел раньше, у меня оказались девять кандидатов: fetchpop, PopTart, get-mail, gwpop, pimp, popperl, popc, popmail и upop. Сначала я остановился на fetchpop, автором которой является Seung-Hong Oh. Я добавил туда мою процедуру переписывания заголовка и другие возможности, которые автор принял в версии 1.9 Несколькими неделями позже я наткнулся на код 'popclient' – программу, написанную Карлом Харрисом – и обнаружил одну проблему. Хотя у fetchpop были оригинальные идеи (например, режим демона), но написан он был любителем. Код Карла был значительно профессиональнее, но его программе недоставало несколько важных возможностей, в том числе и тех, которые я реализовал для fetchpop'a.
Что делать? Оставить все как есть или начать заново? Если бы я начал заново мне пришлось бы пожертвовать своими программами ради более надежной основы для разработки.
Самым существенным поводом для того чтобы начать заново, была поддержка нескольких протоколов. POP3 один из наиболее часто используемых post-office протоколов сервера, однако он далеко не единственный. Fetchpop и другие подобные программы не используют POP2, RPOP или APOP, а у меня уже появилась мысль использовать IMAP – недавно разработанный, очень мощный post – office протокол.