Чтение онлайн

ЖАНРЫ

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

Сейбел Питер

Шрифт:

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

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

Ингаллс: Я никогда этим не занимался. Я больше

склонен к тому, чтобы сосредоточиться на архитектуре - так проще делать утверждения для разных вещей. Если внутри программы можно делать самые разные опасные вещи, то искать формальное доказательство оказывается очень трудно, так как на каждом шагу приходится говорить: “Это могло случиться, вот это могло случиться, да и вот это тоже”. Если архитектура хорошая, то и формальное доказательство может быть столь же очевидным: достаточно прочесть код. Просто говоришь: “Так, это может произойти только из-за того-то. Мы в безопасности”.

Сейбел: Вы когда-нибудь работали с C++?

Ингаллс: Нет. И с Си - тоже.

Сейбел: Но вы программировали на BCPL и ассемблере, то есть нельзя сказать, что низкоуровневым программированием вы не занимались вовсе.

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

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

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

Сейбел: Поговорим о чтении кода. Как вы работаете с новым куском кода?

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

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

Ингаллс: Мне нравится так работать, когда у меня достаточно времени. Когда я только начинаю писать, никаких комментариев не делаю. Когда все начинает работать, я пишу комментарии. Если мне нравится то, что я сделал, или мне кажется, что разобраться с этим будет сложно, я пишу более подробные комментарии. Но мне не нравится идея комментировать все подряд. И еще мне кажется, что чем лучше язык, тем меньше нужны комментарии. Лучше использовать разумные имена переменных. Вот почему мне нравятся именованные параметры в Smalltalk. Они действительно существенно облегчают читаемость. Есть еще такая отличная штука, которую можно использовать в различных местах JavaScript. Хотя это несколько расточительно, в JavaScript применяется запись объекта в фигурных скобках, так что можно использовать ключевые слова, и они действительно похожи на ключевые слова Smalltalk, потому что заканчиваются двоеточиями; поэтому

можно применять объекты в фигурных скобках для передачи нескольких аргументов. Так получаются и впрямь очень симпатичные программы.

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

Ингаллс: Именно.

Сейбел: Удалось ли вам кого-то еще убедить перенять этот стиль?

Ингаллс: Да я узнал, что так работают другие, еще до того, как начал делать это сам.

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

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

Помню одну из своих первых лекций о Smalltalk. Я сказал тогда: “То, чем занимается наша группа, напоминает научный метод: вы проводите наблюдения, выдвигаете теорию для объяснения результатов и ставите эксперимент для проверки”. Именно так мы и работали со всеми поколениями Smalltalk. У нас была теория относительно того, как все это работает. Мы строили систему, она как-то работала. Мы использовали ее некоторое время, а потом выясняли: “Так, лучше бы мы сделали вот это, это и то по-другому”, - и создавали новую систему. Все двигалось по спирали, как и должен развиваться научный поиск и прогресс.

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

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

Сейбел: Разница между инженером и ремесленником, на мой взгляд, заключается в том, что инженер - это тот, кто говорит: “Здесь как в мостостроении. Мосты не падают. В мостостроении есть повторяемый инженерный процесс”. Ремесленник же говорит: “Нет, здесь больше от работы по дереву. Каждое дерево уникально, есть правила его обработки, но ни один метод не гарантирует результата”.

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

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

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

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

Ингаллс: Думаю, прежде всего надо пройти хороший курс компьютерных наук. Я бы организовал его так: сначала нужно выучить несколько разных языков, у которых разные сильные стороны. Так, Smalltalk имеет множество преимуществ, но не является универсальным ответом. Есть логическое программирование. Есть функциональное программирование. Smalltalk можно использовать в функциональном стиле, эта сторона в нем отлично развита. Но помните, что я рассказывал про Lotus 1-2-3 и перевод с английского на “поросячью латынь”? Думаю, полезно было бы взять несколько разных вычислительных сред и одну задачу и попытаться решить ее в каждой из них. Так проявится сила данного языка - или же это побудит вас от него отказаться.

Поделиться с друзьями: