Управление проектами - статьи

         

Моцарт и Сальери


Гуру программирования Ф. Брукс в 1975 году писал []: «Программист, подобно поэту, работает почти непосредственно с чистой мыслью. Он строит свои замки в воздухе и из воздуха, творя силой воображения. Трудно найти другой материал, используемый в творчестве, который столь же гибок, прост для шлифовки или переработки и доступен для воплощения грандиозных замыслов». Некоторые психологи, которые работают с программистами, идут дальше и даже утверждают, что программирование – это высшая форма творчества [].

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

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

Факт 1. Программирование было, есть и останется в обозримом будущем творческой деятельностью.

Творчество неразрывно связано с вдохновением, а это субстанция капризная и непредсказуемая (помните знаменитый сон Д. И. Менделеева, про Периодическую таблицу элементов его имени?). Знаю только, что без вдохновения в программировании не обойтись. И чем сложнее задача, тем труднее извлечь это вдохновение из подсознания. Иногда для этого требуются часы, а иногда недели 5.

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

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

Факт 2. Программирование - не искусство и не наука – это ремесло. Сегодня мы так же далеки от индустриальной разработки программ, как и 50 лет назад.

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

Факт 3. Производительность труда программистов с одинаковым уровнем знаний и опытом в обозримом будущем, по-прежнему, будет отличаться на порядок.




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

Хотите, меряйте производительность в строках исходного кода, хотите – в функциональных точках.

Почему-то, если мы говорим о поэтах, художниках, композиторах, то разброс творческой производительности никого не удивляет. «Творческий полет», «творческий застой» - это про деятелей искусства. А когда говорим о неравномерности производительности программистов, то многие менеджеры начинают с этим спорить, и пытаются «пинать» программистов, как будто это заставит их думать быстрей. Не заставит. Но может заставить уйти или заняться имитацией работы.

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

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

Упрощенно, путь от идеи до ее реализации в этих отраслях выглядит следующим образом: НИР-ОКР-завод. В верхней части этой пирамиды находятся отраслевые НИИ, которые производят идеи и занимаются проектированием новых изделий. На втором этаже пирамиды работают конструкторы в конструкторских бюро, в задачу которых входит реализация нового проекта в чертежах деталей и технологиях изготовления и сборки. На нижнем уровне находятся производственные мощности - заводы, на которых инженеры и рабочие воплощают «в железе» чертежи и технологии.



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

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

Для коллективного программистского творчества скорее уместна аналогия с созданием художественного кинофильма или театрального спектакля. Я полагаю, что количество провальных проектов в этих областях ничуть не меньше, чем в программировании. Дай Бог, если хотя бы пятая часть кинофильмов не «ложится на полки» после первого показа.

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

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

Бизнесмены должны помнить, что инвестиции в разработку ПО в обозримом будущем по-прежнему будут связаны с высокими рисками.


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

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

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

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

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


Инструменты программирования: синтаксические анализаторы, компиляторы и проч., - лишь незначительно помогают в этой работе.

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

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

Образно можно сказать, что программист должен сочетать в себе легкость и полет таланта Моцарта с усидчивостью и скрупулезностью Сальери.

Описанные психологические особенности программистского творчества привели к тому, что наиболее успешными программистами становятся люди, которые обладают выраженным аутистическим складом мышления. Аутистическое мышление (от древнегр. autos — сам) — замкнуто-углубленный тип личности. Применительно к личности используется также термин «шизоид».

Факт 5. Аутист-шизоид – наиболее распространенный среди программистов тип личности.

Мы, программисты, все немного шизоиды 10.


По неофициальным данным [], в компании «Майкрософт» число аутистов среди сотрудников составляет от 5 до 20%. Аутизм это не болезнь! Мы просто не такие как остальное большинство, которое не готово сутками проводить время за мониторами компьютеров и получать от этого удовольствие. И, пожалуйста, не надо нас лечить и переделывать! Это удача для человечества, что рождаются аутисты. Так, по результатам исследований процент гениев (то есть людей, способности которых существенно выше средних) среди людей с диагнозом "аутизм" достигает 20%. В то время как среди так называемых "нормальных" людей он не превышает 0,001%. Психологи считают аутистами таких известных исторических личностей, как Ньютон, Эйнштейн, Гегель, Фрейд, Юнг, Агата Кристи и даже любимый Пушкин 11.

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

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

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

?  Они могут повторять одно и то же действие снова и снова.


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

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

"Аутист видит в компьютере близкое существо, – считает Эми Клин, ассистент профессора Центра детского развития при Медицинской школе Йельского университета. – Компьютеры бескомпромиссны и негибки, а люди, с которыми нам приходится иметь дело, отличаются теми же качествами". Аутизм ограничивает способность таких людей к общению, но вознаграждает их даром невероятной концентрации и творческой продуктивности [].

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

Каждый программный проект это потенциальная катастрофа. И если мы не будем постоянно прилагать усилия к тому, чтобы этой катастрофы избежать, мы неотвратимо к ней придем. Мы подробно писали о специфической сложности программных проектов и непредсказуемости их главной составляющей – программистов. Что же позволяет нам при разработке ПО с уверенностью смотреть в завтрашний день? Ответ прост – управление на макро уровне. В статистической динамике газа мы абстрагируемся от броуновского движения каждой из молекул и оперируем усредненными характеристиками: скорость потока, температура, давление. Аналогично, в программном проекте мы можем в разы ошибиться при оценке трудоемкости реализации каждого отдельного функционального требования. Но наши ошибки будут как в меньшую, так и в большую сторону. Поэтому для проекта в целом они будут компенсироваться 12. В моей практике ошибка суммарной трудоемкости проекта составляет не более 30%.


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

Задачей любого управления является достижение некоторой цели. В нашем случае целью управления является успешное завершение проекта. Если кто-то думает, что успех проекта это реализация в программе 100% требований к назначенному сроку и в пределах выделенного бюджета, то это не так. Успех проекта живет в головах людей. Успех это в первую очередь чувство удовлетворения заказчика 13. Но не только. Успех это еще и чувство удовлетворения людей, которые выполняли проект. Вряд ли стоит называть проект успешным, даже если заказчик остался доволен его результатами, но при этом из компании ушли все профессионалы, участвовавшие в этом проекте. Я сознательно не касаюсь здесь вопросов экономической эффективности проекта и не потому, что «джентльмены о деньгах не говорят», а потому, что это самостоятельный и непростой вопрос совсем из другой области.

Факт 6. Цель управления программным проектом лежит в области психологии.

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

Факт 7. Средства управления программным проектом лежат в области психологии.



То, что важным фактором программистского проекта является психология, начали писать более 30 лет назад, книги Венберга [] и Де Марко [] ничуть не утратили своей актуальности и сегодня. Но понимание того, что психология является решающим фактором успеха или неуспеха проектов разработки ПО, пришло только в последние годы. Радикальным решением проблем кризиса программирования поочередно объявлялись поиск лучшего языка программирования (1960-е годы), технологии программирования (1970-е годы), инструментария программирования (1980-е годы), системы качества (1990-е). И только центральному и ключевому фактору - фигуре самого программиста - внимание почти не уделялось [].

«Именно человеческие качества обеспечивают успех тому или иному проекту, именно они являются фактором первостепенной важности, основываясь на котором надо строить прогнозы о проекте». Это вывод Алистэра Коуберна [], который базируется на результатах анализа очень разных программных проектов, реализованных за последние 20 лет. Проекты отличались друг от друга по количеству программистов, по срокам выполнения, по применяемой технологии - от самой тяжелой (CMM 5-го уровня) до полного ее отсутствия. Коуберн не обнаружил статистически значимой корреляции успеха или неуспеха проекта ни с одной из перечисленных характеристик.

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

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


Содержание раздела