Как вы считаете, каковы особенности мышления выдающихся программистов?
Буч: Выдающийся программист отличается от хорошего способностью полностью абстрагироваться (думать на нескольких уровнях абстракции одновременно).
Миддлтон: Хорошие дизайнеры широко используют эвристические методы быстрого моделирования и имитации различных процессов в уме, то есть осуществляют мысленный перебор самых различных вариантов. Основная работа программиста заключается в том, чтобы строить воздушные замки, а затем совершенствовать их до тех пор, пока они не обретут прочность.
Лоуэнсон: На мой взгляд, идеальный программист - это тот, кто заботится о каждом клиенте и заинтересован в том, чтобы увидеть улыбку на лице пользователя. Он не просто старается войти в положение клиента, а стремится отыскать оптимальное решение, о котором пользователь может и не догадаться.
Гэбриел: Такой специалист держит в голове множество фактов, не упускает из виду ни одной мелочи, старается воспринимать вещи такими, какие они есть, выражает свои мысли четко и ясно, твердо знает, чем стоит заниматься, а чем нет. Эти люди любят точные, красивые фразы. Многие из них имеют музыкальное образование. Подавляющее большинство увлекается научной фантастикой. Они настойчиво идут к своей цели. Они чужды эгоизма, мешающего делу. Им присуще комплексное мышление (умение заранее определить этапы, которые нужно пройти, чтобы решить тот или иной вопрос). Как правило, они стараются разбить сложную задачу на элементарные составляющие.
Можете ли вы сформулировать общефилософскую концепцию программирования, которой придерживаются разработчики, и какова особенность применяемой ими техники?
Миддлтон: На первом месте всегда должно стоять качество. "Старайтесь делать все правильно с первого раза" - вот основной принцип проектирования Руба Голдберга. Пишите как можно проще. Выбирайте тот язык, который лучше всего подходит для решения конкретной задачи. Придерживайтесь модульного программирования. Определите уровни абстракции. Разбейте задачу на составные части, которые можно охватить одним взглядом. Пишите так, словно вы общаетесь не с компьютером, а с человеком. Программы должны способствовать улучшению взаимодействия машин и повышению взаимопонимания между людьми.
Уолтерс: Методы, при помощи которых великие программисты решают те или иные вопросы, выходят за рамки конкретной задачи текущего момента. Разработчики пытаются выделить более общий класс задач или же разбить сложную задачу на элементарные составляющие. Они стараются смотреть в корень и выявить аналогию с теми вопросами, которые уже были реализованы ранее.
Гэбриел: Чтобы стать выдающимся программистом, мало изучить опыт, пусть даже накопленный всем человечеством. Крайне необходима способность без труда держать в голове все детали проекта. Попытки решить нестандартную задачу стандартными методами лишь отдаляют результат. Посмотрите на поэтов и писателей. Как только у них появляются новые мысли, они тут же начинают излагать их на бумаге. То же самое можно сказать о любом виде искусства. А процесс разработки ПО для талантливых программистов - это, безусловно, искусство.
Почему программисты часто отказываются признать новые, более совершенные технологии?
Шреппель: Люди, рассуждающие о достоинствах новых методов, гораздо больше времени тратят на дискуссии, чем на написание кода. На деле преимущества "усовершенствованных" программ обходятся слишком дорого, а программист вынужден выслушивать постоянные упреки босса: "Как, результата до сих пор нет? Почему на такие пустяки у тебя уходит столько времени?"
Буч: Во-первых, таким вещам в университетах не обучают. А во-вторых, большинство разработчиков любую задачу рассматривают исключительно "с точки зрения программирования", не обращая внимания на дизайн и удобный пользовательский интерфейс.
Лоуэнсон: Сегодняшняя жизнь не допускает долгих размышлений, не приносящих быстрого результата. Но я не устаю повторять подчиненным, что думать - просто необходимо.
Миддлтон: Служащие стараются изучать новое на конкретной платформе, а не на абстрактном опыте. Но во многих организациях сотрудники скрывают накопленные знания от окружающих. Программисты не стремятся к самосовершенствованию. Менеджеры часто требуют от разработчиков лишь написания кода, а важнейшие мероприятия, не имеющие непосредственного отношения к кодированию (например, планирование и проведение дальнейших исследований), отодвигаются на второй план. Программисты пытаются связать воедино разрозненные фрагменты кода и, постоянно переписывая и перекомпилируя ранее созданные модули, заставить приложения работать. Они включаются в эту безудержную гонку кодирования, искренне веря в то, что Бог, создавая мир, шесть дней экспериментировал и занимался ерундой, а в последнюю ночь его посетило озарение, и он успешно завершил задуманное.
Гэбриел: Большая часть откровенно слабого программного обеспечения появилась в результате поспешно принятых решений и ошибок, вызванных недостаточно глубоким знанием новых средств. Думаю, это может служить достаточным основанием к тому, чтобы призвать программистов не торопиться.
А что именно, по-вашему, должны изучать программисты?
Уолтерс: Необходимо в совершенстве знать базовые блоки программного обеспечения, в частности шаблоны, представляющие собой универсальный набор решения задач общего назначения. Обучая этому слушателей учебных заведений и помогая им привести новую задачу к уже известному виду, преподаватели тем самым прививают новому поколению дизайнеров и программистов любовь к элегантности.
Миддлтон: Преподаватели концентрируют внимание на вопросах анализа, архитектуры, тестирования и управления проектом, а информацию о правилах построения конструкций можно почерпнуть из классической учебной литературы. К правилам построения конструкций можно отнести, например, выбор имен для процедур. Хорошим программным конструкциям присущи понятные, недвусмысленные имена.
Действительно ли написание элегантного кода имеет важное значение?
Шреппель: В повседневной работе программиста элегантность не входит в разряд приоритетов. Главная цель заключается в том, чтобы обеспечить приемлемое качество при минимальной стоимости. Очень часто единственно правильным решением является создание дешевого программного обеспечения весьма посредственного качества.
Миддлтон: Компании больше не могут сквозь пальцы смотреть на то, как их сотрудники транжирят драгоценное время, пытаясь сократить размер программы еще на один байт. Надежность и долговечность продукта для фирмы гораздо важнее блестяще написанного кода. Если нужно усовершенствовать код, основное внимание следует уделять процессу, а не продукту.
Уолтерс: Универсального элегантного решения не существует в принципе. Некоторые задачи настолько просты, что об элегантности говорить не приходится. Многие разработчики стремятся писать как можно более сжатый и запутанный код, нарекая приложения элегантными вследствие их новизны. Они считают, что им удалось достичь небывалых высот, но никто ничего не может понять в их программах.
Буч: Вы можете обладать необычайным мастерством и писать очень хорошие конструкции, но сами по себе эти конструкции ничего не будут значить. Нужна хорошая архитектура. Поэтому я стараюсь поменьше говорить об элегантных алгоритмах и побольше об элегантной архитектуре - простой, гибкой, обладающей большим количеством шаблонов.
Лоуэнсон: Элегантность выражается в том, насколько удачно технология вписывается в пользовательские концепции и определяется отношением клиентов к продукту.
Что нужно делать директору информационной службы для того чтобы найти и воспитать хороших программистов?
Миддлтон: Основное качество, которое необходимо выдающимся программистам, - это страстный интерес к самому процессу разработки. Пытается ли кандидат на это звание усовершенствовать собственную технологию написания кода? Знаком ли он с аналитическими методами, отличающимися от наиболее модных веяний сегодняшнего дня? Специалист, рассчитывающий на успех, должен быть любознательным, дисциплинированным и свободным от тщеславия. Программистам, отличающимся излишней эксцентричностью, лучше сразу оставить свои помыслы.
Необходимо тщательно анализировать исходный код программного обеспечения и делать надлежащие выводы. Дайте разработчикам понять, какое важное значение вы придаете качеству программного кода. Подарите каждому из них хотя бы одну книгу, посвященную программированию; создайте общую библиотеку; если разработчику удалось написать код, достойный внимание, разошлите его всем остальным и организуйте его обсуждение; храните и пополняйте архив подобных примеров (например, на узле intranet), иллюстрируйте примеры описанием заложенных в них принципов.
Уолтерс: Я стараюсь поставить перед программистами конкретную задачу (она не обязательно должна быть связана с написанием кода, как правило, можно ограничиться уровнем проекта) и посмотреть, как они с ней справятся. После этого нужно оценить эффективность выбранного ими подхода и проанализировать вопросы, которые были заданы. Сумеют ли они найти общее решение? Смогут ли избежать чрезмерного усложнения задачи? Начнут ли с промежуточного, незавершенного варианта или сразу предложат законченное решение?
Шреппель: Постарайтесь найти кого-нибудь, кто уже писал подобные программы или создавал нечто похожее. Лучший способ обучения новичков - это анализ конкретных практических примеров.
Лоуэнсон: Программисты значительно повысят свою квалификацию и улучшат качество продуктов, если им удастся использовать то лучшее, что уже было создано другими.
Уолтерс: Повторно используемый элегантный код все равно остается элегантным, несмотря на то, что чужое авторство больно бьет по самолюбию программистов.