неинтересно?
Ингаллс: Ну, тут можно просто не вмешиваться в то, как они работают над своей частью общей задачи, и только иногда осуществлять самое общее руководство, когда требуется. Нередко это и к лучшему. Мне повезло долгое время работать со множеством сотрудников, которым я доверял. Очень важно доверять тем, с кем вместе работаешь. Еще один важный фактор - уверенность. Когда цель ясна, быть уверенным легко. Плохим управление бывает как раз тогда, когда беспокоишься, не чувствуешь себя в безопасности и боишься, что нужно постоянно за всем и за всеми следить.
Сейбел: Когда вы еще были рядовой рабочей пчелой, попадался ли вам действительно выдающийся руководитель?
Ингаллс: Лучшим боссом в моей жизни, конечно, был Алан Кэй. Я работал под его началом в Xerox, пожалуй, в ключевые годы моей жизни, и это была интересная комбинация, потому что он знал, чего хочет, но почти никогда не говорил, как я должен работать. При этом у него было столько технической смекалки во всем, что это делало его отличным критиком. И я, и мои коллеги отличались в то время большой продуктивностью, так что, полагаю, он чувствовал, что при таком уровне прогресса ему совершенно необязательно вмешиваться. Но он прикрывал и меня, и всех нас, и у него в голове была четкая картина того, что он хочет получить на выходе.
Сейбел: Когда люди работают в группе, какой подход лучше избрать? Тот, при котором у каждого разработчика есть свой кусок системы: “Вот это мой код, не трогайте его”. Или вся команда занимается всем кодом, и любой может работать на всех участках?
Ингаллс: Не знаю. Вот как мы сейчас работаем над проектом Lively Kernel: у разных людей разные участки работы, но никаких преград при этом нет. Это во многом вопрос квалификации, концентрации или целей. Пытаюсь вспомнить, как мы работали в те времена, которые были действительно успешными. Никогда не работал в больших командах, так что действительно получается так, что в большинстве случаев люди единолично трудились каждый над своим кодом.
Сейбел: Если говорить об отладке, то какую самую страшную ошибку вам когда- либо удалось найти?
Ингаллс: Она была связана со сборкой мусора. Сборка мусора - самое плохое, потому что проблема проявляется намного позже того, как что-то случилось. Исправление таких сложных ошибок напоминает мне взлом кодов. Мой отец работал в Управлении стратегических служб, они там работали в командах и главным образом просто собирали информацию, чтобы быть в курсе дела. Затем появлялось закодированное сообщение с фрагментом чего-то, что они видели в новостях, и таким образом они его расшифровывали.
Примерно так же отслеживается ошибка. Когда я приступал к делу, мне помогала интуиция, чутье на то, что могло вызвать данную ошибку в данной ситуации. В тот раз, к примеру, я думал по меньшей мере сутки. Когда у меня наконец все получилось, я был просто в восторге, и мой сын, которому тогда было, кажется, четыре года, вручил мне “Приз великого отладчика”.
Сейбел: Это было, полагаю, на Smalltalk. У вас был символический отладчик или вы смотрели шестнадцатеричные дампы памяти?
Ингаллс: Это был отладчик более низкого уровня, чем тот прекрасный отладчик Smalltalk. Деталей сейчас не приведу, но если находишь ошибку, она приводит к низкоуровневым отладчикам. То есть смотришь на память как на восьмеричные значения. И потом видишь, что один объект указывает на другой, а этого быть никак не может. И начинаешь думать: “Как такое могло случиться?” Там были закономерности, были догадки по поводу того, что именно могло вызвать ту или иную неполадку, так что на их основе и нужно было работать.
Сейбел: Это было на самом низком уровне. Но работая в такой замечательной среде, как Smalltalk, вы, скорее всего, используете символические отладчики. Приходится ли вам прибегать к выводу на печать?
Ингаллс: Честно говоря, не знаю никого, кто бы так делал, имея возможность пользоваться хорошим отладчиком. Потому что куда вы помещаете print?
Сейбел: Чем так хорош отладчик для Smalltalk?
Ингаллс: Можно остановиться на любом месте программы и посмотреть на все связывания всех переменных. Можно исполнять фрагменты кода и вычислять выражения прямо в контексте.
Сейбел: В любом месте стекового фрейма?
Ингаллс: Да, и далее можно внести существенные изменения и продолжить. Затем можно вернуться к ошибке, вывести ее на экран, сохранить полностью состояние системы, перебросить его кому-нибудь другому, кто сидит за компьютером с Windows, а не на Маке; он может запустить тот же самый образ, попасть туда же, где сейчас находитесь вы, внести исправление и продолжить. Полное сохранение состояния, несмотря на различные варианты операционных систем.
Сейбел: Инварианты - это другой тип инструментов отладки. Многие очень озабочены формальными входными и выходными условиями всех их методов и инвариантами классов. Некоторые относятся к этим вопросам проще. Каково ваше мнение относительно инвариантов?
Ингаллс: Вероятно, я принадлежу к менее формальному лагерю. Во многом из-за того, что считаю, что вещи должны быть насколько возможно простыми. То же самое я думаю относительно типов. Типы по сути являются предположениями по поводу программы. И я думаю, что очень полезно делать все максимально простым, даже не заикаясь о каких-либо типах. Думаю, если серьезно подходить к системе, то неплохо иметь возможность добавлять подобные вещи: например, можно ввести подразумеваемые типы и видеть их только при желании.
Но типы - только одна вещь из многих, к которым относятся блоки и все другие варианты операторов утверждений, которые вы можете внедрить. Это часть той поразительно интересной отрасли, которую нам еще только предстоит изучить с помощью синтетической математики. Думаю, с течением времени мы сможем все лучше понимать вычислительные сферы и документировать их с помощью живой документационной системы, настоящей программной документации. То есть существуют такие операторы утверждений, которые могут действительно помочь вам, притом что вы их обычно не видите. Но если у вас затруднения, то можно запустить их и тестировать с их помощью самые различные вещи.
Сейбел: Что вы думаете по поводу формального доказательства корректности программ?
Ингаллс: Я никогда этим не занимался. Я больше склонен к тому, чтобы сосредоточиться на архитектуре - так проще делать утверждения для разных вещей. Если внутри программы можно делать самые разные опасные вещи, то искать формальное доказательство оказывается очень трудно, так как на каждом шагу приходится говорить: “Это могло случиться, вот это могло случиться, да и вот это тоже”. Если архитектура хорошая, то и формальное доказательство может быть столь же очевидным: достаточно прочесть код. Просто говоришь: “Так, это может произойти только из-за того-то. Мы в безопасности”.
Сейбел: Вы когда-нибудь работали с C++?
Ингаллс: Нет. И с Си - тоже.
Сейбел: Но вы программировали на BCPL и ассемблере, то есть нельзя сказать, что низкоуровневым программированием вы не занимались вовсе.
Ингаллс: Да. Кстати, мы действительно немного писали на Си для отладки некоторых вещей, сгенерированных с помощью Squeak. Но я помню, что когда мы делали Squeak, то моей целью, среди всего прочего, было создать такую систему, для управления которой не нужно было бы знать ничего,
Сейбел: Но вы наверняка смотрели C++, когда он вышел, поскольку вы входили в группу, которая - возможно, наряду с изобретателями Симулы - может с наибольшими основаниями