День рождения Ершова

Памяти Г.И. Кожухина

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

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

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

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

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

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

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

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

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

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

  • Возможна и нужна ли организация разработки софтвера по принципу конвейерной линии?
  • Кого и почему труднее найти для реализации софтверного проекта — руководителя или исполнителя?
  • Как сочетать элитарность системного программирования с его массовостью?
  • Как воспитывать программиста, через мировоззрение (университет) или путем профессиональных навыков (технический институт)?
  • Что такое индивидуальные способности в программировании, специфичны ли они и нужны ли?
  • Можно и нужно ли отделять проектирование большой программы от ее изготовления?


Эти вопросы являются частью общей проблемы, поэтому сделаем лишь частные комментарии при попытке связать их постановку с анализом человеческого фактора в программировании.О конвейере
В каком-то смысле конвейер является дьявольским изобретением. Поднимая продуктивность на небывалый уровень, он в то же время в максимальной степени превращает человека в придаток машины. Конвейерный метод в программировании может либо убить интеллектуальную компоненту в труде программиста, либо вызывать неврозы из-за противоречия между монотонностью и трудностью работы. Представьте себе человека, обязанного 8 часов в день, 5 дней в неделю, 50 недель в году решать одни кроссворды, и вы поймете, что такое программист, специализирующийся, например, на написании редактирующих программ. Одним словом, раскрепление людей по элементарным операциям в многомодульной системе — далеко не простая задача.О руководителях и исполнителях
Не торопитесь ставить руководителя на первое место, объясняя, что, по определению, руководителя найти или создать труднее. Давайте подумаем, почему сплошь да рядом руководитель проекта предпочитает начинать с молодыми специалистами, кончившими университет два–три года назад, нежели с людьми, чей стаж работы превышает пять лет? Не потому ли, что мы предпочитаем использовать чистый лист и пластичность молодого человека, нежели преодолевать пассивное сопротивление более зрелого и менее ясного для нас 33-летнего главы семейства. Но это, в частности, означает, что мы не умеем гармонично развивать профессиональные достоинства исполнителя так, чтобы они не падали с возрастом и были бы полезны не только для руководителя, но и для него самого и его будущих начальников.
Элитарность программистов представляется автору очевидной и в этом виде является серьезным вызовом человечеству в целом, причем можно надеяться, что вызов будет принят и преодолен. Эта мысль будет расшифрована несколько позднее.Мировоззрение и профессионализм
Проблема, конечно, не только в том, чтобы объективно оценить требуемое соотношение кандидатов наук и дипломированных инженеров-программистов, хотя вокруг этого возникает изрядное количество всем известных кадровых проблем. Суть проблемы в том, чтобы признать, что программирование требует от человека несколько особого взгляда на мир, его потребности и эволюцию, особой моральной подготовленности к своему долгу. Программист — это солдат научно-технической революции и как таковой должен обладать революционным мышлением.
Теперь подходим к тому, чтобы сформулировать центральный тезис статьи. Он состоит в утверждении, что программирование обладает богатой, глубокой и своеобразной эстетикой, которая лежит в основе внутреннего отношения программиста к своей профессии, являясь источником интеллектуальной силы, ярких переживаний и глубокого удовлетворения. Корни этой эстетики лежат в творческой природе программирования, его трудности и общественной значимости.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[источник]

© Habrahabr.ru