Кодеры за работой. Размышления о ремесле программиста - Питер Сейбел 11 стр.


Фицпатрик: Я люблю оптимизацию за то, что без нее можно обойтись. Вы делаете это, когда все уже работает, а это самое важное. Дальше вы либо экономите деньги, либо устраиваете соревнования по гольфу на языке Perl: как сделать этот код короче или значительно быстрее? Нам надо было обнаружить наиболее часто используемые участки кода в Живом Журнале, и я устроил небольшие состязания: "Вот код. Вот тестовая программа. Сделайте код максимально быстрым". И выслал парсер заголовка балансировщика нагрузки. Мы писали безумные регулярные выражения, без поиска с возвратом, пытаясь захватить что-то самым эффективным способом. Мы соревновались друг с другом, получая все более эффективные решения. Но на следующий день пришел один парень. Он написал все на C++ с применением XS и говорит: "Я выиграл".

Сейбел: Сегодня обратная сторона этого в том, что...

Фицпатрик: Время программиста дороже подобной ерунды? Да, это верно, но только если компьютеров мало. Если количество компьютеров возрастает, время программиста начинает стоит меньше, чем компьютеры, на которых установлено ПО. В этом случае стоит писать на Си, и профилировать свой код, и исправлять компилятор, и платить людям за работу на GCC для ускорения компиляции.

Сейбел: Но даже Google использует C++, а не ассемблер, так что есть какая-то точка, в которой попытка выжать максимальную производительность становится невыгодной. Или есть теория, что хороший компилятор C++ генерирует лучший код, чем все программисты на ассемблере, которых еще поискать?

Фицпатрик: Мы все еще пишем кое-что на ассемблере, но крайне редко. Мы профилируем огромное количество кода, и бывают случаи, когда требуется переписать код с Perl на Си, а потом с Си на ассемблер. Но даже для платформы х86 есть различные варианты этой платформы. Вы действительно хотите писать разный ассемблерный код для каждого варианта платформы x86? Этот процессор использует SSE 2, а этот только SSE 3.1. Пусть лучше всем этим занимается компилятор.

Сейбел: Вы учились программированию по руководству программиста еще в детстве. Есть ли книги, которые вы настоятельно рекомендуете начинающим или всем программистам?

Фицпатрик: Если говорить о Perl, то даже программисту, который знает его хорошо, я бы посоветовал книгу Марка Джейсона Доминуса (MJD) "Higher-Order Perl" (Высокоуровневый Perl). Книга действительно отличная, автор начинает с простых вещей, и вы думаете: "Знаю, знаю, что такое замыкания", - но он потихоньку долбает ваш мозг, и к концу книги он просто готов взорваться. И хотя теоретически я знал все это, но увидев столь экстремальный подход, изменил свое мнение. Я рекомендовал эту книгу многим своим друзьям, им она тоже взорвала мозг. В целом, я бы советовал читать книги, которые заставляют думать по-новому. Это просто самый свежий пример, который мне вспомнился.

Сейбел: Вижу, у вас есть книга "The Art of Computer Programming", но она не выглядит слишком потрепанной. Вы много из нее прочли?

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

Сейбел: Как вы считаете, в каком объеме программист должен знать математику? Чтобы прочесть и как следует понять книги Кнута, нужно иметь приличную математическую подготовку. Но необходимо ли это сегодня программисту?

Фицпатрик: Ему не нужно так уж много математики. Для большинства программистов в ежедневной работе гораздо важнее статистика. Если рисуешь всякие графики, то математика, само собой, нужна, но большинство программистов в основном разрабатывают разные корпоративные приложения на Java и всякую ерунду для Сети. Очень помогает знание логики, ну и статистика тоже очень полезна.

Сейбел: Вы явно все еще получаете удовольствие от программирования. Но если почитать ваши записи в Живом Журнале времен учебы в колледже, создается впечатление, что вы порой уставали и начинали ненавидеть компьютеры.

Фицпатрик: О да, я всегда ненавидел компьютеры. Похоже, тут уже давно нет никакого прогресса. Кажется, что компьютеры все медленнее работают, все чаще падают и глючат, чем раньше. Но поскольку я оптимист, то верю, что все изменится к лучшему. Наверное, десять лет назад я получал больше удовольствия от работы, чем сегодня. Может быть, десять лет назад мой компьютер работал быстрее; мне кажется, что тогда он работал лучше. Компьютеры стали быстрее, но в то же время программы стали больше глючить и работать медленнее.

Сейбел: Как думаете, почему?

Фицпатрик: Не знаю. Может, понизилась планка? Или, раз компьютеры стали быстрее, можно забыть об эффективности - или совсем не думать о том, что делаешь? У меня нет ответа. Может быть, всё вышесказанное в совокупности. А может, просто появилось такое множество слоев абстракции, что люди перестали понимать, что же происходит внутри, а компьютеры стали настолько быстрыми, что скрывают их глупость.

Сейбел: То есть, возможно, программы не настолько быстро работают, как должны бы работать при такой скорости компьютеров. Но ведь десять лет назад вообще не было таких возможностей, какие сегодня предоставляет пользователям тот же Google.

Фицпатрик: Да. Некоторые пишут эффективный код и им пользуются. Я не играю в компьютерные игры, но когда порой наблюдаю за чьей-то игрой, думаю: "Черт, как такое возможно?" Я просто в шоке. Очевидно, что некоторые делают все правильно.

Наверное, в основном я недоволен своими настольными приложениями. Похоже, большинство хорошего, интересного происходит на стороне сервера. А работая на своем компьютере, я все больше разочаровываюсь. Наверняка мой Мак не должен постоянно показывать мне вращающиеся пляжные мячи смерти.

Сейбел: Не интересует ли вас написание более качественных настольных приложений?

Фицпатрик: Проблема в том, что они никому не нужны. Хочется разрабатывать приложения, которыми будут пользоваться, а сейчас всем нужны веб-приложения. Однажды я потерял ноутбук, и все спрашивали: "Как, ты потерял информацию?" Но на нем не было никакой информации. Это был просто терминал для работы в Сети. А диск был зашифрован, так что я не беспокоился насчет паролей, cookies и всего такого. Мне кажется, люди уже не хотят скачивать программы.

Сейбел: А что вас сильнее мотивирует: то, что ваш продукт используют другие, или просто удовольствие от программирования?

Фицпатрик: Конечно же, есть программы, которые я пишу для себя, и пишу явно в расчете на то, что ею буду пользоваться я один; в этом случае я меньше забочусь насчет патчей и всего такого. Но часто мне хочется работать с другими. Наличие пользователей - ключевой момент для совместной работы. Чем больше пользователей, тем больше ошибок они находят, тем больше сценариев использования. Работать с другими людьми интереснее, особенно в проектах с открытым исходным кодом.

Всегда приятно, когда тебе пишут: "Привет, мы используем твою программу для того-то". Глядя на то, сколько сайтов используют mem-cached, балансировщик нагрузки или еще что-нибудь, я думаю: "Как здорово!" А сколько владельцев порносайтов сообщали мне, что пользуются моей файловой системой! Это о чем-то говорит. Я помогаю порноиндустрии. В Крейгслисте каждый запрос направляется через вебсервер, который использует memcached. Вот так.

Сейбел: Как по-вашему, программисты склонны излишне увлекаться всем новым - языками, инструментами и так далее?

Фицпатрик: Да, возможно. Может быть, тут есть отчаянная надежда, что новая версия вдруг окажется нормальной, что новый язык будет делать все, что нужно. Но так думают и пользователи - они всегда хотят получить новую версию, даже если она хреновее.

Не знаю, отличаются ли статистически программисты от других людей. Новое - значит, лучшее. Далеко не всегда это так, но люди надеются. Они хотят, чтобы было именно так. Помню беседовал как-то со своим дантистом - она вспоминала все новые и новые методы в стоматологии, кажется, за последние лет пять, и была от них просто в восторге.

Сейбел: Искусство программиста сейчас во многом состоит в том, чтобы найти нужные компоненты и понять их ровно настолько, чтобы суметь ими воспользоваться. Что вы об этом думаете?

Фицпатрик: В CPAN есть все. Там 14 парсеров ID3. Выберите один.

Сейбел: Так вот проблема современного разработчика - выбрать одно из 14 решений. Как вы делаете выбор?

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

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

Сейбел: Можно ли быстро выяснить, подходит тебе что-то или нет?

Фицпатрик: Я просто начинаю. Не включаю это сразу же в свой код, а сперва пишу тестовую программу, которая использует несколько нужных мне функций, чтобы убедиться, что все работает. Или пишу модульный тест только для этой библиотеки и только для тех данных, которые предполагаю использовать вместе с ней. У многих библиотек нет собственных тестов. Но даже если есть, может быть так, что читаешь документацию и не доверяешь тому, что в ней написано, или по ней невозможно понять, что делается. Поэтому я пишу собственные тесты для того, что мне нужно. Поскольку для изучения этой библиотеки мне все равно придется написать пробную программу с ее использованием, я вполне могу начать с модульного теста.

Сейбел: А как насчет инструментов, которыми вы сейчас пользуетесь, - по-прежнему применяете Emacs?

Фицпатрик: Да, я все еще использую Emacs. Правда, не знаю его так хорошо, как хотел бы. Я знаю все горячие клавиши, но сам не настраиваю его. Пользуюсь чужими настройками и почти могу прочесть их. Иногда мне это надоедает, и я думаю: "Пора бы написать кое-что на Elisp для привязки этой штуки к горячей клавише", - но никогда этого не делаю.

Стив Йегг (Steve Yegge) работает над проектом, который в основном заменил бы язык Elisp на JavaScript. Жду, пока он закончит, чтобы не учить еще один язык. Пишу все эти штуки на JavaScript, но не рассматриваю его как язык. Это язык для броузеров. В Google я много чего писал на JavaScript и потом встраивал это в Java и C++. Я понял, что JavaScript для этого отлично подходит.

Сейбел: Есть инструменты, которыми вы регулярно пользуетесь, при том что терпеть их не можете? Кроме ваших настольных приложений.

Фицпатрик: Да, все настольные приложения. У меня их куча. Эти броузеры все время виснут, падают и занимают кучу памяти. Вся моя операционная система виснет. Коллеги, видя, как я работаю в Emacs, пытаются убедить меня, что Eclipse или IntelliJ все это делают у них автоматически. Раз в полгода я пробую то или другое. Но эти чертовы штуки просто крутятся там, съедая память и падая в процессе ввода (наверно, не справляются с тем, что я набираю). Ладно, фоновая подсветка синтаксиса или компиляция в другом потоке. Но зачем при этом блокировать ввод с клавиатуры? Что ж, снова попробую то или другое через полгода. И я счастлив, что не обязан использовать.все это. Мне и с Emacs неплохо.

Моя кривая обучения выглядит так: я быстро изучаю что-нибудь, пока не смогу работать с этим достаточно быстро и качественно. Обычно это где-то 80-90%, тогда я работаю весьма продуктивно, мне не приходится постоянно что-то искать, вот и отлично. После этого я продвигаюсь уже медленнее. И только если мне что-то очень уж приглянулось, говорю себе: "Пора поглубже изучить документацию этого языка - мануалы - и обшарить все потайные углы и щели".

Сейбел: Насколько это разумно сегодня? Ведь столько вещей, которые можно изучить. Можно бесконечно изучать работу со своим редактором, но сколько программ вы сумеете написать при этом?

Фицпатрик: Да, но для меня такие усилия всегда окупаются (по крайней мере, что касается редакторов). Когда я изучаю что-то, это окупается в течение недели, может быть двух. Если я пишу дурацкий скрипт командной оболочки или маленький скрипт на Perl, или еще что-то, что автоматизирует мою жизнь, это всегда окупается.

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

Фицпатрик: Нет. Я все это делаю с какой-нибудь целью. Да, я знаю тех, кто постоянно работает над своими инструментами, никогда ничего не доводя до конца. И я могу двинуться в этом направлении, но недалеко.

Сейбел: Каков, по-вашему, самый важный навык для программиста?

Фицпатрик: Мыслить как ученый; за один раз изменять только что-то одно. Терпение и стремление понять коренную сущность вещей. Это особенно ценно при отладке или проектировании чего-то, что не желает работать. Иногда молодые программисты говорят: "Черт, эта штука не работает", - и переписывают ее целиком заново. Стоп. Попытайтесь понять, что происходит. Научитесь разрабатывать программу шаг за шагом, так чтобы была возможность проверять ее на каждом шаге.

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

Фицпатрик: Иногда я отхожу от привычного пути - пишу что-нибудь на языке, которым обычно не пользуюсь. Я знаю, что это займет больше времени, но также знаю, что это все-таки благо. Например, когда я пришел в Google, мне часто приходилось писать всякие однодневные программы, и я всегда#писал их на Perl. А потом сказал себе: "Стоп, а напишу-ка я это на Python". Теперь я пишу массу всего на Python, и это меня не напрягает - даже не приходится что-то искать. Perlbal был изначально написан на С#, просто чтобы выучить этот язык.

Сейбел: Какие навыки, помимо профессиональных, должен развивать программист?

Фицпатрик: Коммуникабельность, хотя я не уверен, что ее действительно можно развить. Больше общайтесь по электронной почте. Умение общаться в письменном виде очень важно. Но оно и в жизни пригодится, правда? Было какое-то исследование насчет того, кто из выпускников более успешен - умные ребята или общительные? Выяснилось, что именно общительные ребята могут заработать любые деньги, а не те, кто хорошо учился. Думаю, это интересно.

Сейбел: Мне кажется, со временем что-то изменилось. Раньше программисты могли прятаться по офисам, как гномы. Сейчас они активно переписываются, общаются друг с другом.

Фицпатрик: Да, везде, где я работал, в проектах с открытым исходным кодом или в компаниях, все зависят друг от друга. Побудительный мотив: "Я напишу это, потому что знаю, что тебе это понадобится через две недели, или через две недели мне понадобится твое". Все это относится к человеческим взаимоотношениям.

Сейбел: Говорят, лучший программист на порядок продуктивнее худшего. Вы с этим сталкивались?

Фицпатрик: Да, но, по-моему, это характерно для любой области. Все зависит от опыта. Не то чтобы я часто встречал двух программистов, которые занимались примерно одним и тем же, и один сделал в десять раз больше другого. Но, похоже, если постоянно не совершенствовать навыки, начинаешь деградировать и выпадаешь из обоймы.

Думаю, есть те, кто занимается этим только ради заработка, но на самом деле без удовольствия. Что нормально. Но зачем сравнивать их с программистами по призванию? Кто продуктивнее - тот, кто постоянно думает о деле, или тот, кто думает о нем только в рабочее время?

Сейбел: Вы говорили о научном подходе к отладке. Считаете ли вы себя ученым, инженером, художником или ремесленником?

Фицпатрик: Ученым или инженером. Пожалуй, скорее инженером. А потом уже ученым - и только из-за принципа изменять за один раз что-то одно и подхода к диагностике проблем. Я считаю себя инженером в смысле подхода к проектированию. Среди моих друзей есть те, кто считает себя художником или ремесленником, но я о себе так никогда не думал.

Сейбел: С другой стороны, инженеры часто завидуют программистам. Помните шутку: "Если бы небоскребы строились так, как мы пишем программы, первый же дятел уничтожил бы цивилизацию". Как вы считаете, создание программного обеспечения - это понятная инженерная дисциплина?

Фицпатрик: Нет. Пока что это не так. Да, чтобы писать код, лицензия не нужна. Я не сторонник кучи предписаний, но не хотел бы, чтобы некоторые из РНР-программистов, допускающие все эти атаки через XSS, занимались системами управления полетами. Я бы предпочел, чтобы здесь была четкая официальная граница.

Назад Дальше