OCaml». Таким образом, он был постоянно занят. Я тоже был постоянно занят и боролся со скукой, но по- другому.
У меня были приятели, которые бросили колледж в первый же год и стали делать всякую ерунду для Сети. Некоторые занялись порносайтами и всяким таким, типа “мы заработаем кучу денег”. И они с головой уходили в работу, но делали только деньги, больше ничего. Колледж - прекрасное место для общения и вечеринок. Если бы я занимался только Живым Журналом, я бы умер от стресса.
Сейбел: Вы довольны тем, что изучали компьютерные науки?
Фицпатрик: Пожалуй, я мог бы обойтись и без этого. Но я много делал и такого, чего сам бы никогда не сделал, так что, думаю, это было полезно. Мне хотелось бы, наверное, заняться чем-нибудь еще, например остаться еще на один год и изучить что-то совершенно постороннее, скажем лингвистику. Мне немного жаль, что я учился в колледже вполсилы из-за того, что много уже знал изначально. На первых курсах я вообще почти не появлялся на занятиях, а когда под конец стало интересно, получилось так: “Поздравляем, вы закончили обучение”.
Сейбел: А о магистратуре думали?
Фицпатрик: Да. Было бы интересно, но я был слишком занят.
Сейбел: Вы читаете современную компьютерную литературу?
Фицпатрик: Мы с друзьями посылаем друг другу статьи - хорошие такие статьи. Я, например, недавно читал статью насчет изменения размеров фильтров Блума во время выполнения. Потрясающая статья. Статьи с конференций по системам хранения данных, как из промышленных кругов, так и из академических, о разных прикольных системах - я стараюсь читать все это. Что-то попадалось насчет Reddit[26], то ли приятель прислал мне статью, то ли в чьем-то блоге была ссылка на нее.
Сейбел: Вы упомянули о статьях из научных и промышленных источников. Как по- вашему, сегодня есть место, где эти источники сливаются?
Фицпатрик: Иногда у меня и правда возникает такое впечатление. Но часто интереснее читать статьи, основанные на практическом опыте, ведь они пытаются решать реальные проблемы, и их решения работают, в отличие от мыслей вроде: “Мы думаем, будет очень прикольно, если...”. Из научного мира исходит много безумных идей, которые на самом деле не работают, так и оставаясь безумными идеями. Может быть, позднее эти идеи превратятся в коммерческие продукты.
Сейбел: Как вы проектируете программное обеспечение?
Фицпатрик: Я начинаю с интерфейсов между некоторыми элементами. Какие методы более свойственны системе - удаленные вызовы или запросы? Если речь идет о хранилищах, я пытаюсь понять, какие запросы будут более частыми. Какие нужны индексы? Как данные будут читаться с диска? Потом я пишу заглушки для различных частей системы, развивая их со временем.
Сейбел: Вы пишете заглушки, чтобы можно было писать тесты до написания остального кода и выполнять их по ходу разработки?
Фицпатрик: Более того. Я всегда проектирую ПО именно таким способом, даже без применения тестов. Сначала я проектирую интерфейсы и хранилища данных, а затем берусь за их реализацию.
Сейбел: В каком виде осуществляется проектирование? Псевдокод? Реальный код? Каракули на белой доске?
Фицпатрик: Обычно я беру редактор и пишу заметки с псевдокодом для схемы базы данных. Доведя ее до ума, создаю реальную схему и копирую/вставляю все скрипты, чтобы удостовериться в том, что операторы create table работают. После этого приступаю непосредственно к реализации. Я всегда начинаю с файла
Сейбел: Бывает ли так, что, написав уже порядочный кусок кода, вы сталкиваетесь с необходимостью пересмотреть свой первоначальный план?
Фицпатрик: Бывает. Но я начинаю с самых сложных кусков или с тех частей, в которых не уверен, и пытаюсь реализовать их в первую очередь. Я стараюсь не оставлять ничего сложного или потенциально неожиданного под конец: я предпочитаю с самого начала решить наиболее трудные вещи. Причина, по которой я так и не завершил ряд своих проектов (друзья говорят, что их целая куча), связана с тем, что я начинал с наиболее сложной части проекта, изучал то, что хотел изучить, и не возвращался к оставшейся неинтересной части.
Сейбел: Можете ли вы дать совет программистам-самоучкам?
Фицпатрик: Всегда старайтесь делать что-нибудь чуть более трудное, чем раньше, то, что вам не по зубам. Читайте чужой код. Я слышал это много раз, но дошло только со временем. Несколько лет я писал много кода, не читая чужой код. Потом я попал в Сеть, а там сплошь и рядом открытый код, в развитии которого каждый может принять участие.
Но я был до смерти перепуган, предполагая, что не смогу в нем разобраться, ведь автором этого кода был не я, и все его устройство не укладывалось у меня в голове.
Потом я начал делать патчи для Gaim, программу мгновенного обмена сообщениями под GTK, начал копаться в коде - и увидел его в целом, я понял это, просто рассматривая отдельные фрагменты кода. После просмотра чужого кода я понял (не могу сказать, что полностью понимаю собственный код), что начал видеть паттерны. “Так, отлично. Я понял структуру, по которой он строится”.
И тогда я начал действительно получать удовольствие от чтения кода, потому что, не понимая некоторый паттерн, задавался вопросом: “Какого хрена они сделали это именно так?” - и начинал изучать код внимательнее. Потом говорил себе: “Ух ты, да это же и правда отличный способ решения этой проблемы, мне понятно, как он оправдывает себя”. Я бы делал это и раньше, но боялся, поскольку считал, что если код не мой, то я не смогу его понять.
Сейбел: А каким образом вы читаете чужой код? Вы начинаете с того, что читаете код, чтобы понять его в общих чертах, или читаете только тогда, когда нужно внести какие-то исправления?
Фицпатрик: Обычно я хочу что-то исправить. Или просто читаю чужой код, если действительно уважаю его автора. Может, это помогает осознать, что он тоже смертный, и не стоит его боготворить. Или узнать из его кода что-нибудь полезное.
Сейбел: Допустим, вы знаете, какие изменения хотите внести. Как вы поступаете?
Фицпатрик: Прежде всего нужно достать архив исходников или получить последнюю версию из SVN и заставить эту проклятую штуку компилироваться. Преодолеть это препятствие. Для большинства оно оказывается самым сложным из-за дополнительных зависимостей в системе сборки или из-за неверных предположений об уже установленных библиотеках. Иногда мне хочется, чтобы крупные проекты шли с образами виртуальных машин, с полностью настроенным окружением для сборки.
Сейбел: Вы имеете в виду что-то вроде VMware?
Фицпатрик: Да. Если просто хочешь по-быстрому что-то исправить, то вот тебе все зависимости. Связь с людьми устанавливается достаточно быстро. Все отлично работает.
Так или иначе, когда у вас есть чистая работающая сборка, забейте на все и просто сделайте одно долбаное изменение. Измените заголовок окна на “Брэд говорит „Hello world'”. Измените хоть что-нибудь. Пусть там все ужасно, просто начните вносить изменения.
Затем по ходу работы пишите патчи. Думаю, это лучший способ начать диалог. Если участвуешь в списке рассылки и пишешь что-то вроде: “Привет, я хочу добавить возможность X”, человек, поддерживающий эту систему, скорее всего, ответит: “Какого хрена, я занят. Отвали. Терпеть не могу возможность X”. Если же напишешь что-то вроде: “Я хочу добавить возможность X. Я думал сделать такой вот патч”, - а это совершенно неверный путь - но ты говоришь: “Но я думаю, что это неправильно. Думаю, что правильный путь - это реализовать X”, более сложный путь, и тебе, скорее всего, ответят что-то вроде: “Черт, он старался и, смотрите, пошел совершенно неверным путем”.
Возможно, это заденет того, кто поддерживает этот код, и он решит: “Слушай, не могу поверить, что вот на ЭТО потрачено столько сил. Ведь так просто сделать правильно”. Или: “Боже, столько работы - и все впустую. Надеюсь, больше этим путем не пойдут”. И тогда тебе ответят.