Питер Сейбел - Кодеры за работой. Размышления о ремесле программиста
Сейбел: Вы когда-нибудь считали это упущением? Не было желания получить более систематическое образование?
Завински: Да, были времена, особенно в Lucid, когда я осознавал, что все, о чем говорят эти парни, покрыто для меня мраком, потому что это никогда мне не требовалось и прошло мимо. Потом я освоил терминологию, разобрался в общих чертах, о чем они говорят, и немного читал, когда что-то нужно было узнать. Конечно же, иногда, особенно в молодости, я говорил себе: “Господи, я же ничего не знаю”. Просто минутная слабость, но был и испуг. Мальчишка среди всех этих парней с учеными степенями - “Ааааа, я ничего не знаю! Я идиот! Что я здесь делаю?”
Моя жизнь была бы иной, если бы я проучился подольше. Но в тот момент я мог поступить только так, как поступил.
Сейбел: А бывало наоборот - когда вы чувствовали, что в настоящем программировании понимаете гораздо лучше окружающих вас компьютерных ученых?
Завински: Да, причем довольно часто. Но без этих мыслей вроде “Вы ребята выбрали не тот путь” или “Нас просто интересуют разные вещи”. Я не хочу быть математиком, но математиков критиковать не собираюсь.
Весьма странно, что люди часто путают эти профессии. Они думают, что разработчик с огромной теоретической базой размышляет точно так же, как разработчик настольных приложений. У них мало общего.
Сейбел: Вы по сути самоучка. Что вы можете посоветовать программистам-самоучкам?
Завински: Тут все не так просто, поскольку мир сильно изменился. Я всегда странно себя чувствую, когда заходит разговор на тему “Как это было у меня”. Я не знаю, правильно ли я тогда поступил. А люди всегда воспринимают это в смысле “Делай, как я”.
У меня это вышло случайно. Так получилось, вот и все. Я принял решения, которые привели к другим решениям, и вот результат.
Я то и дело получаю электронные письма примерно такого содержания: “Я хочу стать программистом, что мне делать?” Или: “Идти мне в колледж или нет?” Что я могу ответить? В 1986 году я бы дал однозначный ответ. Но сегодня никто не сможет пойти по моему пути, потому что его больше нет.
Десять лет назад я бы говорил, что перво-наперво следует изучить язык ассемблера. Нужно осознать, как работает компьютер. Так ли важно это сейчас? Не знаю. Может быть, да. А может, и нет. Может, через десять лет все программное обеспечение будет представлять собой веб-приложения или распределенный код, выполняемый на арендованных кластерах, части которого, находясь на десятке серверов Google, порождают собственные копии и воссоединяются после получения результатов. Нужно ли будет для этого знать ассемблер? Или все настолько абстрагируется, что это уже будет неважно? Я не знаю.
Я был поражен, когда узнал, что люди получают дипломы программистов, не написав ни строки на Си. Начав с Java, они там и остались. Это кажется неестественным и неправильным. Но откуда мне знать, правильно это или нет? Может, дико думать: “А мы в свое время программировали с помощью девятивольтовой батареи и твердой руки!”
Сейбел: А что скажете о книгах? Есть ли книги по компьютерным наукам или программированию, которые должен прочесть каждый?
Завински: Я читал их не так много. Я всегда рекомендую книгу “Structure and Interpretation of Computer Programs”[15], которая многих пугает, потому что там много о Лиспе. Но я думаю, что она действительно учит программированию, а не конкретному языку. Мне кажется, что многие курсы для начинающих делают упор на синтаксис. Я видел это в старших классах и на вводных курсах, когда недолго учился в Карнеги-Меллоне.
Они обучают не программированию, а тому, куда поставить точку с запятой. Это отталкивает людей от программирования, потому что это не самая интересная его часть. Даже для тех, кто знает, что делает.
Была еще книга - как же она называлась? - про отладку, ее написал кто-то из Microsoft. О том, как эффективно использовать утверждения. Помню, мне она показалась стоящей, но не потому, что я узнал из нее много нового, а потому, что именно эту книгу хочется дать прочесть идиоту-коллеге.
Была и еще одна книга, которую все считали величайшим трудом своего времени: “Design Patterns”[16]. По-моему, отстой. Там учили программировать методом “вырезания и вставки”. Вместо того чтобы подумать над своей задачей, берешь сборник рецептов, ищешь там что-то более-менее похожее и просто пытаешься это воспроизвести. Это не учебник программирования, а книжка-раскраска. Но, похоже, многим она нравилась. И при встрече они перекидывались словечками из этой книги - такой паттерн, сякой паттерн. А вы о чем — о цикле? Ясно.
Сейбел: Есть ли ключевые навыки, необходимые каждому программисту?
Завински: Любопытство, желание разобрать что-то по косточкам. Стремление узнать, что там внутри происходит на самом деле. Думаю, это основа программирования. Без этого далеко не пойдешь. Это основной "путь получения знаний. Чтобы научиться создавать что-то свое, нужно разобраться в чем-то уже готовом, посмотреть, как оно устроено. По крайней мере, для меня это так. Я очень мало читал компьютерной литературы. Я учился, копаясь в исходниках и читая документацию. У меня была цель, для достижения которой я должен был знать, что делает эта штука и вот эта. Я просто шел наугад, пока не понимал, куда мне нужно.
Сейбел: Вы читали “The Art of Computer Programming” Кнута[17]?
Завински: Нет. Это одна из тех книг, которую действительно стоило бы прочесть. Но я этого так и не сделал.
Сейбел: Читать ее достаточно сложно. Для ее понимания требуется хорошая математическая подготовка.
Завински: А я совсем не математик.
Сейбел: Довольно интересно, что многие программисты выходят из математиков и компьтерная наука прочно опирается на математические теории. А вы являетесь живым доказательством того, что это не обязательно. Какой объем математических знаний необходим, чтобы стать хорошим программистом?
Завински: Это зависит от того, где провести границу, определяющую, что относится к математике, а что нет. Сопоставление с образцом (Pattern matching) - это математика или нет? Понимание порядка величин и основ комбинаторики должно быть на интуитивном уровне. Но я полностью уверен, что элементарный математический тест я бы провалил. Ведь я давно не занимался чем-то настолько формальным.
Разве что в старших классах на уроках математики. Алгебра, немного матанализа. У меня не очень-то хорошо получалось. Я осилил это, но по-настоящему своим так и не ощутил. В старших классах была физика и основы механики. На лабораторных работах мы двигали бруски по наждачной бумаге и все такое. На уроках физики я выглядел просто ужасно, чувствуя себя полным идиотом, а ведь мне все это нравилось. Лабораторные работы я делал отлично, у меня здорово получалось. После этого на математику меня просто не хватало.