Айк: Да, или - это моя личная проблема - я живу на планете сказок. Сейчас я постарел, стал скептичнее, работаю лучше, но все еще настроен слишком оптимистично. В каком-то уголке моего сознания Говорящий сверчок шепчет: "Да у тебя там, должно быть, ошибка, ведь ты наверняка о чем-то забыл". Со мной так всегда.
Иногда я точно знаю это - знаю, что где-то ошибся, - и покрываюсь потом. У меня свербит не то в заднем мозгу (где это, кстати?), не то в микротрубочках. Так или иначе, я чувствую, что должен быть начеку, и отладчик помогает мне быть начеку. Он помогает мне принять решение или понять, что вот этот тест-вектор не покрывает всех комбинаций кода, так как передо мной обширное гиперпространство.
Сейбел: Кроме чтения кода многие программисты читают еще и книги по специальности. Есть ли книги, которые вы можете порекомендовать?
Айк: Мне надо было бы читать побольше. Но это как в музыке: главное - практика. Можно узнать очень многое, читая чужой код. Мне очень нравились книги Брайана Кернигана, написанные предельно логично - написать небольшой фрагмент кода, использовать его заново по мере продвижения, строить модули. Еще "Искусство программирования" Кнута, тома 1-3, особенно та часть, где говорится о получисленных алгоритмах. Двойное хеширование - я люблю эти главы. Лемма о золотом сечении, которую требуется доказать в качестве упражнения.
Но, по-моему, по книгам не слишком-то научишься программировать. Программирование отчасти близко инженерному искусству: в один прекрасный день может понадобиться математика. И есть куча практических вещей, которые даже не поднимаются на уровень инженерного искусства, как оно понимается в строительстве и технике. Возможно, со временем все это чуть больше формализуется.
Нет, конечно, есть определенный объем знаний: компьютерная наука - все же наука. Помню, лет двадцать назад был спор в Usenet, и кто-то заметил: "Недонаука, показатель строгости - одна треть". Есть куча мимолетных брошюрок, которые явно не выдержат проверку временем. Журнальные статьи лучше, так как на них обязательно требуется отзыв, да и контроль там строже. Области автоматизированных доказательств - это впечатляет. Но эти статьи все еще не доходят до программистов. Поэтому в компьютерных науках кое-чего, пожалуй, не хватает, и я из-за этого недоверчиво отношусь к чтению книг. Видимо, все же не надо настолько уподобляться луддитам.
Есть наука, есть важные вещи, которые надо усвоить. На это можно потратить много времени. Я знаю чистых теоретиков в отделе развития JavaScript. Многие из них хорошие программисты. Некоторые не программируют вообще. Они мало знакомы с практикой. У них случаются любопытные и порой полезные озарения, но писать программы, выпускать их, делать работоспособными, чтобы они завоевали свою долю рынка, - все это далеко от теории. Но я интересуюсь теорией, она делает нашу жизнь лучше.
Сейбел: Но ведь есть и другие книги - те, которые учат практике программирования, не нагружая вас теорией.
Айк: Такие книги мне нравятся. Мы говорили о труде Кнута, посвященном литературному программированию. Там был раздел о практике программирования - он мне пришелся по душе. Люблю книги по Smalltalk. Сейчас мне кажется, что они оказали большое влияние - книга Адели Голдберг, а до нее журнал "Byte".
Сейбел: С воздушным шаром на обложке?
Айк: Да. Она сильно перевернула мои взгляды. 1981 год или около того. Тогда я мало занимался программированием. Я думал о нем, читал о нем, терзал старое железо, учась на последнем курсе. Чистота среды в Smalltalk, то, в какой степени она поддерживала сама себя, - все это заставило меня обратиться к программированию, к языкам и виртуальным машинам. Работая с UNIX, я имел дело с физическими машинами и операционными системами, но не переставал читать. Была такая книга издательства Springer-Verlag - сборник статей, в котором народ в основном фантазировал насчет универсального формата объектных файлов и байт-кода Java еще до его появления. Но Smalltalk был мощной штукой. Я освоил Smalltalk позже, в Иллинойском университете, когда его приспособили для работы на компьютерах Sun того времени. Работало все медленно.
Сейбел: Сменим тему. Как вы распознаете талантливого программиста?
Айк: Недавно мы наняли такого - он был другом одного из самых могучих умов в нашей компании. То ли студент последнего курса, то ли бакалавр - кажется, еще не закончил колледж. Он познакомился с парнем, который работал у нас, - оба они OCaml-программисты. Он размышлял о проблемах, которые были поставлены в моем статическом анализе. По его ответам на вопросы не скажешь, что он еще мальчик. Кое-кто из наших говорил: "Да что он такого великого сделал? Мы берем только звезд, зачем тратить на него время?"
Я отвечал: "Нет, ребята, вы не правы. Надо брать специалистов, пока они молоды. Он сделал много чего для себя на OCaml; он знает не только исходный язык, но и рабочую среду, он разобрался с системными методами и написал на OCaml операционную систему - пусть пока игрушечную. Но это стоящий парень". Я даже не дал ему никакого теста - просто слушал его рассказ о том, что и почему он сделал. Он не пережевывал эту вечную жвачку насчет шаблонов C++. У нас, к сожалению, есть и такие мальчики. Милые люди, в чем-то неплохие программисты, могут работать на Java. Но нам нужен был кто-то необычный, а этот парень был необычным.
Поэтому главной проблемой стало убедить людей, что его возраст и отсутствие большой практики ничего не значат. Но мы взяли его, и он стал суперзвездой. Он придумал инструменты для статического анализа; сперва создавал их на платформе Berkeley Oink с открытым кодом, а потом на GCC в качестве плагинов вместе с разработчиками GCC. Сейчас он активно взялся за наши программы для мобильников: делает элементарное профилирование, выводя отметки времени через printf, ищет, где можно снизить издержки.
Разговаривая с ним, я понял, что он талантлив. Хорошо было и то, что его рекомендовал блестящий программист, - такие люди тянутся друг к другу и обычно не рекомендуют посредственностей. Они хотят работать с такими же блестящими программистами. Может показаться, что я выдумываю, но для меня это и правда один из способов распознать талант. Наверное, именно поэтому мы берем к себе суперпрограммистов. Думаю, все люди из Valgrind оказываются у нас. Некоторые из них могут все и совсем не выделываются.
Сейбел: Итак, это один из способов проводить собеседование: дать человеку поговорить о собственных проектах.
Айк: Да. Я никому не даю головоломок. Некоторые из наших, правда, дают. И это меня тревожит, поскольку влияет на отсев кандидатов.
Сейбел: Можно ли сразу выявить нужного человека?
Айк: Сомневаюсь. В Google дают поиграть в пики, так что у них есть сколько-то народа, отлично решающего головоломки. Но они не всегда обладают здравым смыслом и способны на зрелые суждения. Так что я сомневаюсь. Пожалуй, в какой-то мере это необходимо, ведь человек с хорошо подвешенным языком необязательно силен в программировании. Надо посмотреть, как он принимает решения прямо на месте, без обдумывания. Мы даем людям чисто практические задачи. Ни головоломок, ни продвинутой математики - задачи по программированию.
Проверяйте знание C++, поскольку C++ - сложная штука. Это что-то вроде базовой проверки, вовсе не решающий аргумент. Прошел человек такую проверку - хорошо, нет - тревожный сигнал. Для приема на работу нужно что-то еще. Нужны подробности: что человек сделал, каков его подход к программированию, с какими языками он работал.
Кроме того, мне, видимо, нравятся необычные люди. Я не имею в виду всякие странности. Я не хочу нанимать человека, с которым трудно сработаться, - нам нужны таланты. Нужны те, кто мыслит нестандартно.
На последнем курсе меня сильно впечатлила книга Пирсига "Дзэн и искусство ухода за мотоциклом". Еще я много читал Платона и других древних философов. В философском плане я склонялся к идеализму. Полагал, что обратный порядок байтов лучше прямого, так как байты меньшего порядка располагаются по меньшим адресам - в этом есть какая-то гармония, геометрическая правильность. Но попробуйте прочесть шестнадцатеричный дамп! Важны практические вещи, важны подробности. Есть известная фреска "Афинская школа", на которой Аристотель указывает вниз, а Платон вверх. Так вот теперь я на стороне Аристотеля. С возрастом я становлюсь все скептичнее и все больше интересуюсь тем, что реально работает.
Когда я опрашиваю потенциальных кандидатов, то мне очень сложно не увязнуть в мелочах, в практических вопросах. Этот парень знает OCaml? Хорошо. Но стоит ли брать его на работу? Только из-за этого - нет. Но он еще делал что-то для себя, умеет решать задачи с ходу, думает о проблемах компиляции или анализа. Значит, возьмем. Но, возможно, главным доводом здесь была рекомендация его друга, блестящего программиста.
Сейбел: Программирование все еще доставляет вам удовольствие?
Айк: Да. Это как привычка. Тут есть некая загадка. Меня привлекает не задача создать работающий код, а скорее поиск верной идеи в духе соотношения 90/10, как в нью-джерсийской философии. Вы создаете хорошее теоретическое ядро, которое не решит всех ваших проблем, но если вы попадаете на оставшиеся 10%, то ничего страшного. На этом пути можно добиться успеха: код остается сравнительно небольшим и несложным, и есть некая игра в переходе от теории к реализации. Вот это мне по-прежнему нравится, все так же волнует меня. Я обдумываю такие проблемы по ночам и не могу заснуть.
Сейбел: А есть то, что со временем вам стало нравиться меньше?
Айк: Ну, не знаю... Наверное, C++. Мы научились пользоваться всеми его свойствами, которых слишком много. Система типизации в нем, пожалуй, лучше, чем в Java. Но мы все еще применяем отладчики и компоновщики 1970-х - полный идиотизм! Не понимаю, как мы до сих пор их терпим.
Нетерпение и неприязнь к примитивным инструментам - вот из-за чего я старался совершенствоваться в программировании. Наш код сегодня испещрен проверками утверждений, и они фатальны. Но именно это помогает мне, особенно когда я применяю к коду тот самый принцип 90/10, не удовлетворяющий всем инвариантам. Я что-то упустил, утверждение срабатывает, и вдруг - раз! - я понимаю, как его исправить.
Даже сейчас я часто убеждаюсь в собственных недостатках, когда слишком усердно оптимизирую что-нибудь. Рисуя себе радужную картину, я забываю о какой-нибудь важной проблеме. Это всегда испытание для меня, ведь программист должен быть оптимистом. Считается, что мы параноики и невротики, вечно озабоченные чем-то персонажи Вуди Ал-лена, но на самом деле параноику нечего делать в программировании.
Сейбел: Как вам кажется, программирование - это удел молодых?
Айк: Думаю, у молодых огромные преимущества, прежде всего психологические. Им не хватает лишь мудрости! Становишься старше, работаешь медленнее - но ты усвоил горькие уроки и хочешь передать свой опыт следующему поколению. Я вижу, как они отворачиваются от меня и сами усваивают эти уроки, - и сжимаю кулаки.
Но человек знающий, который старается быть в курсе всего, не обязательно должен выдавать много кода. Нет, конечно, объем продукции тоже важен. Но что первостепенно для меня - и об этом мы много беседовали в Netscape, когда там искали главного инженера, - это найти человека, не менеджера, а того, кто своим авторитетом заставит других программистов писать код в нужном духе. Ведь один программист просто не справится со всеми задачами.
Вот эта возможность воздействовать на людей, когда они перенимают твой подход и твой опыт, так что в результате получается код, непосильный для одного, так же важна для меня, как возможность сидеть ночами и писать в одиночку собственный длиннющий код.
Я по-прежнему работаю слишком много, а теперь у меня еще и маленькие дети. Моя жена - славная девушка, но ей не очень нравится, когда я засиживаюсь за работой. Ведь я занимаюсь не только программированием, но и вот этими, более важными вещами. В случае с JavaScript нам надо было развивать язык. Это требовало не то что проповеднического пыла, но умения заставить людей думать о последствиях эволюции языка, о том, каким они его видят. И надо было разбираться с кучей разных ответов.
Не все программисты способны на это - многие склонны работать, забившись в свой угол. Но работая в Netscape, я понял, что мне нравится взаимодействовать с людьми, которые пользуются моим кодом. Если я забьюсь в свой угол, мне будет не хватать этого. А я хочу постоянно решать такие задачи. Да, я могу выстроить для себя прекрасный воздушный замок, но будет ли он удобен для других? Вряд ли. В чем же тогда смысл? Как говорил Гиллель-старший, "кто я без других"?
Я не связываю себя только с JavaScript. Поначалу мы страшно спешили, делали массу ошибок, и как-то Джейми переслал мне пост из Usenet со словами: "Говорят, ваш детище - урод". Теперь у меня настоящие дети, и те дела больше меня не волнуют.
5. Джошуа Блох
Сегодня Джошуа Блох - главный Java-архитектор в Google, до этого работал в Sun Microsystems, где был удостоен звания Заслуженный инженер и руководил созданием и реализацией Java Collections Framework, появившегося в Java 2, а также внес некоторые дополнения в язык для версии Java 5. Получил степень бакалавра в Колумбийском университете, PhD - в Университете Карнеги-Меллона, где работал над Camelot - распределенной системой обработки транзакций, позднее получившей название Encina; она была выпущена компанией Transarc, где Блох являлся старшим системным проектировщиком. Написал книгу "Effective Java", удостоенную Премии Джолта за 2001 год, и еще две в соавторстве - "Java Puzzlers" (Java: головоломки) и "Java Concurrency in Practice" (Java: параллельность на практике).
Как и следовало ожидать оттого, чья работа состоит в пропаганде использования Java в Google, Блох - активный сторонник этого языка. Несмотря на сегодняшний всплеск интереса к таким инструментам параллельной обработки данных, как Software Transactional Memory или механизм обмена сообщениями в языке Erlang, Блох считает, что в Java реализован "наилучший, сравнительно с другими языками", подход к параллельным процессам, и предсказывает возрождение интереса к Java по мере того, как программисты будут переходить на многоядерные процессоры.
Блох также защищает отношение к программированию как к проектированию API. Мы беседовали о том, как это помогает ему самому конструировать программы, о том, что Java становится слишком громоздким языком, и о том, что выбирать язык программирования - почти то же, что выбирать бар.
Сейбел: Как получилось, что вы занялись программированием?
Блох: Так и хочется сказать, что это у меня в крови. Мой отец работал химиком в Брукхейвенской национальной лаборатории. Когда я учился в четвертом классе, он пошел на курсы программирования. Компьютеры, понятно, тогда были большими ЭВМ за стеклом, и надо было отдавать пачку перфокарт оператору. Пощупать их было нельзя, но сама мысль о том, что вот есть такие вычислительные машины, делающие для тебя разные штуки, меня поразила. Поэтому я чуть-чуть поднабрался от отца Фортрана, пока он учился на курсах.
Сейбел: Это какой же год?
Блох: Кажется, 1971. Но по-настоящему я загорелся этим лишь через несколько лет - благодаря системе разделения времени. На Лонг-Айленде был компьютер DECsystem-Ю, которым пользовались все школы округа Саффолк. Другой такой же предназначался для округа Нассау. Сколько известных теперь людей начинали на одной из тех двух машин!
Как только появляется интерактивность, человек сразу загорается. Я программировал на Бейсике, как и все в 1973-1976 годах. Вот тогда уже все было серьезно. Любопытно, что у меня от того времени сохранились программы на телетайпной бумаге Teletype - телетайпы все еще живы! - и глядя на них, я понимаю, что мой стиль был отчасти заложен уже тогда.
Сейбел: Можете ли вы вспомнить свою первую по-настоящему интересную программу?
Блох: 4 июля 1977 года я написал свой вариант известной игры 20Q (Двадцать вопросов) и назвал его "Животные". Там было бинарное дерево с вопросами типа "да/нет" на внутренних узлах и животными на листьях. Когда программа встречала незнакомое животное, она "заучивала" его название, задавая пользователю вопросы, предполагающие ответ "да" или "нет". Так она училась отличать новое животное от того, название которого определила неверно. Бинарное дерево хранилось на диске, так что программа со временем становилась "умнее".
Помнится, подумалось: "Черт, да она же учится!" Это было что-то вроде прозрения. Еще помню, как классе в десятом работал на той самой DECsystem-10. Нам не позволялось писать то, что сейчас называют мгновенными сообщениями, - слишком много системных ресурсов они отнимали.
Сейбел: Как и сейчас.
Блох: Давайте не будем об этом. Мгновенные сообщения - моя погибель. Хотя нет, моя погибель - электронная почта, сообщения - пустяки. Так или иначе, я был непослушным мальчиком, поэтому включился в проект для Лонг-Айлендской математической ярмарки, который я называл "программами межпрофессиональной коммуникации".
Сейбел: Вы писали эти программы?
Блох: Да, кроме одной, которую писал мой приятель Томас Де Беллис. Интересно, что программа Тома была написана целиком на Бейсике. Она была строчно-ориентированной и использовала для связи файлы. Она не была особенно быстрой или эффективной - но работала! Я написал две - одну строчно-ориентированную, другую с посимвольной записью - на MACRO-10, языке ассемблера для PDP-10. Для связи там использовалось подобие разделяемой памяти, названное "старшим сегментом" (high segment).
Тогда я ничего не знал о параллельном программировании, почти не понимал мьютексы. Но там были буферы сообщений и независимые агенты, которые пытались общаться друг с другом параллельно. Поэтому там имелись состояния гонки, и порой программа теряла символ-другой. Старшекласснику постичь все это было почти невозможно.
Сейбел: Вы сказали, что некоторые элементы вашего стиля проявились уже в первых программах. Какие?
Блох: Стремление сделать программу читаемой. Как говорит Кнут, программа - это прежде всего литературное произведение. Я уже тогда каким-то образом понял, что программа должна быть читаемой. И я сохранил этот подход.
Сейбел: А что изменилось?
Блох: Трудно сделать программу читаемой, когда можешь давать переменным имена длиной только в один символ. Так что сейчас я больше забочусь об именах переменных. Да и вообще, когда берешься за новый язык с новыми свойствами, многое меняется. То, что смутно понимал, укладывается в голове.