Эстетический и человеческий факторы в программировании

А.Ершов

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

Мой исходный тезис состоит в том, что сейчас для программистов наступают трудные времена. Объем программ возрастает несоизмеримо по отношению к зарплате. Романтический ореол непостижимости этого занятия, если он когда-либо и существовал, начинает меркнуть. Так называемые софтверхаусы тают, как вчерашний снег на солнце. Будучи самой дефицитной профессией каких-нибудь семь лет назад, программирование начинает появляться в книгах агентств по занятости. Оспаривается даже само стремление рассматривать программистов как профессионалов особого рода. Главное же это то, что вольная братия программистов постепенно попадает под влияние администраторов и менеджеров, которые стремятся сделать труд программиста планируемым, измеряемым, однородным и обезличенным.

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

С этих позиций должен согласиться, что как профессия программирование еще не достигло своей зрелости. Характерным свидетельством этому в течение последних лет была волна мелкого бизнеса, связанного с софтверхаусами. Такой софтверхаус "сооружался" в течение нескольких недель группой толковых программистов, как правило, покинувших большую организацию, в которой они получили начальный опыт. В большинстве случаев мотивом для такой инициативы была жажда наживы, полудетское желание избавиться от излишней опеки, конечно, в сочетании с некоторой интересной и полезной идеей в области разработки софтвера.

Однако в этом деле жизнеспособными оказались лишь такие коллективы, в которых этот партизанский дух быстро заменялся режимом экономии, иерархией отношений, жесткой дисциплиной, словом, всем тем, что в свое время вытолкнуло их из "родительского дома". В качестве шутки можно заметить, что вся эта история напоминает сказку о трех поросятах: братья-программисты в конце концов собрались в крепком софтверхаусе, но лишь после того, как первые два были унесены волчьим ветром беспощадной коммерции.

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

Мой второй тезис состоит в том, что эта система ценностей в программировании объективно существует, однако осознана не до конца, известна на всем и поэтому требует распространения и защиты. Эта система имеет много компонент, пожалуй, самая важная из них — это профессиональный статус программиста (надо сказать, что я говорю о программистах в широком смысле, причисляя к ним и системных аналитиков), но мне сейчас больше хочется сказать об эстетической, или об эмоциональной, стороне программирования, причем не только о том, что вознаграждает программиста, когда он выходит со своим продуктом на рынок, но и о том, что составляет его нравственную опору, когда он остается наедине с программой или машиной.

Вы, конечно, можете спросить меня, а стоит ли говорить об этом? Ответ будет состоять не только в том, что программирование стало сейчас массовой профессией.

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

Трудность профессии программиста в том, что именно программисты непосредственно "упираются" в пределы человеческого познания в виде алгоритмически неразрешимых проблем и глубоких тайн работы головного мозга.

Ее трудность также в том, что программист должен обладать способностью первоклассного математика к абстракции и логическому мышлению в сочетании с эдисоновским талантом сооружать все что угодно из нуля и единицы. Он должен сочетать аккуратность банковского клерка с проницательностью разведчика, фантазию автора детективных романов с трезвой практичностью бизнесмена. А кроме того, программист должен приобщаться к корпоративным интересам, иметь вкус к коллективной работе, понимать цели работ и многое другое.

Я знаю, что эти трудности могут быть преодолены только путем большого эмоционального напряжения, требующего от программиста особого самосознания и внутренней позитивной установки. Если когда-либо А.Хейли напишет роман "Вычислительный центр", вы увидите, что это будет самый увлекательный его бестселлер.

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

Эти вопросы являются только частью общей проблемы. Посмотрим вкратце, как связать поставку этих вопросов с анализом человеческого фактора в программировании.

О конвейере. Я лично считаю конвейер поистине дьявольским изобретением. Поднимая продуктивность на небывалый уровень, но в то же время является самым бесчеловечным видом работы из всех мне известных. Конвейерный метод в программировании может либо убить интеллектуальную компоненту в труде программиста, либо вызвать неврозы из-за противоречия меду монотонностью в трудоспособностью работы. Представьте себе человека, обязанного 8 часов в день, 5 дней в неделю, 500 недель в году, решать одни кроссворды, и вы поймете, что такое программист, специализирующийся, например на написании редактирующих программ. Одним словом, раскрепление людей по элементарным операциям в многомодульной системе -- далеко не простая задача.

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

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

Мировоззрение и профессионализм. Проблема, конечно, не только в том, чтобы объективно оценить требуемое соотношение кандидатов наук и дипломированных инженеров, хотя вокруг этого возникает изрядное количество всем известных кадровых проблем. Суть проблемы в том, чтобы признать, что программирование требует от человека несколько особого взгляда на мир, его потребности и эволюцию, особой моральной подготовленности к своему долгу. Программист – это солдат технической революции и как таковой должен обладать революционным мышлением.

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

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

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

Сначала я сделаю некоторые замечания, отражающие внутреннюю природу программирования.

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

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

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

В отношении к машине у честного программиста есть еще одна особенность. В некотором смысле он относится к ней как хороший жокей к своей лошади. Зная и хорошо понимая возможность машины, он никогда не позволит себе компенсировать леность ума беззаботной тратой ресурсов ЭВМ. Это чисто эстетическое отношение к делу является самым эффективным предохранителем против бездумной "пессимизации" софтвера, которая хотя и не вызывает особых возражений у компаний, продающих машинное время, но на деле приводит к надувательству покупателя или потере эффективности.

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

Быть хорошим программистом – это сейчас такая же привилегия, как быть грамотным человеком в ХVI веке. Эта привилегия дает право программисту ожидать аналогичного признания и уважения со стороны общества. К сожалению, эти ожидания не всегда оправдываются. Хочу только заметить, что осуществление этого признания требует работы с обеих сторон. В частности, для программиста необходимо следование одному этическому принципу, который носит общий характер для всякого профессионала, но имеет специальную интерпретацию для программиста. Чисто логически имеют место три варианта: работа ради работы; работа ради денег; работа ради цели.

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

Говоря об общественной функции программирования, не могу не заметить, что на пути к реализации этой функции лежит одна нерешенная техническая проблема - обеспечение аккумулятивного эффекта программирования. Это очень сложная, но абсолютно необходимая для решения проблема. Спектр мнений о ней – бесконечен. Одни говорят, что сейчас работают только считанные проценты составленных программ, другие считают, что OS/360 – это уже практически бессмертный комплекс программ. Возвращаясь к теме моей речи, хочу сказать, что предоставление программисту перспективы длительного и стабильного использования его продукта окажет решающее воздействие на его профессиональное самосознание.

Позвольте теперь с позиций только что сделанных утверждений завершить обсуждение ранее перечисленных альтернатив и трудных проблем.

Об индивидуальных способностях в программировании. Нам необходим образ идеального программиста. Конечно, это будет мифическая личность. Но кто сказал, что нам не нужны мифы и сказки о программистах? Каждый из нас должен хоть раз в жизни видеть или хотя бы слышать о чудо-программисте, из программы которого нельзя убрать ни одной команды, или который пишет тысячу команд в день, или обнаруживает ошибку при исходном шансе один к миллиону и т.д. Человеку свойственно искать ориентиры и примеры. Именно с этих позиций хочу внести свой вклад в спор о пресловутых "примадоннах" в коллективах программистов. Объявлять их нежелательными -- это по крайней мере близорукость или зависть к их исключительным качествам. Мне посчастливилось в жизни встретить несколько таких примадонн от программирования, которые при всей их индивидуальности и даже экстравагантности вносили неоценимый вклад в работу коллектива, особенно в трудных ситуациях. Так что я решительно стою за признание и полный учет весьма широкого диапазона в индивидуальных способностях к программированию.

О разделении проектирования и изготовления софтвера. Налицо двойственное отношение к этому вопросу. Руководители, ответственные за долговременные проекты, и многие другие ищут пути к формализации этапов разработки и передачи проекта из одних рук в другие. В то же время само дело отчаянно сопротивляется такому разделению. Я хочу сказать, что правильное решение этого вопроса невозможно без учета человеческого фактора и эстетической потребности, препятствующей тому, чтобы заниматься реализацией чужих идей или не видеть самому овеществления своей идеи. Отдавать технический проект в чужие руки – то же самое, что посылать своих детей в интернат, что хотя и бывает необходимо, но чревато потерями.

В заключение хочу вернуться к тезису об элитарности программирования и о его будущем. Моя апологетика на первый взгляд подчеркивала исключительный, особый характер программирования и его предельные требования к человеческим возможностям. Эта требовательность и образует тот самый вызов человеку, о котором я говорил вначале. Когда я был последний раз в Соединенных Штатах в 1970 г., на меня произвели большое впечатление новые идеи профессоров Массачусетского технологического института Марвина Минского и Самюэля Пейперта об обучении детей. Они выбросили в корзину ходячее представление, что дети учатся бессознательно методом подражания. Они доказывают, что человек чемуто научается только в том случае, если у него в голове складывается блоксхема действия, выделены подпрограммы и приложены информационные связи. Профессор Пейперт навсегда обратил меня в свою веру на примере жонглирования двумя мячами, когда, апеллируя к моим способностям программиста, он за десять минут научил меня тому, чего я сам не сделал бы и за несколько часов.

Таким образом, человек неизмеримо усилит свой интеллект, если сделает частью своей натуры способность планировать собственные действия, вырабатывать общие правила и способ их применения к конкретной ситуации, организовывать эти правила в осознанную и выразимую структуру, – одним словом, сделается программистом.

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

Я назвал ряд актуальных проблем, в том числе связанных с человеческим фактором в программировании. Я не назвал, пожалуй, самой главной. Мы сейчас ненасытно вербуем молодежь в программисты, обещая им златые горы. Однако поколения людей меняются значительно медленнее, чем поколения машин. Почитайте рекламы технических журналов за последние 10 лет. Слова "революция", "Новое поколение" появляются там с неимоверной частотой. Я хотел бы спросить авторов этих реклам, а знают ли они, как сделать, чтобы программист в возрасте свыше 50 лет был бы не меньше полезен ему, чем 30-летний. Через 30 лет у нас таких программистов будет миллион. Пожалуй, честно будет сказать, что сейчас у нас нет даже подхода к тому, как ассимилировать ветеранов в современных условиях изменчивости и нестабильности, сделав тем самым профессию программиста пожизненной и дающей человеку ощущение социального удовлетворения.


Andrei P. Ershov: Aestetics and Human Factor in Programming. Commun. ACM 15(7): 501-505 (1972). A Luncheon address at the AFIPS Spring Joint Computer Conference in December 15, 1972


КИБЕРНЕТИКА 1972 No.5 с.95-99

(со стилистическими исправлениями Н.Безрукова)