Психологические причины неудач программных проектов

Tags: программирование, project management, agile

Неразрешимая проблема

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

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

«Умные» программисты

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

Рисунок 1. Предполагаемое распределение интеллекта программиста.

Согласно Википедии, у человека, заканчивающего 1-3 года обучения в колледже, IQ составляет не менее 104, что, как я подозреваю, является минимумом для программистов типа «Обучись сам Java за 24 часа». Это означает, что после естественного распределения в отрасли существует значительное число “середнячков”

Природа проблемы

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

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

Модель 4 + 2

Надо однозначно определить глупость в контексте программирования.

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

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

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

Следуя работе Карло М. Сиполлы, программистов можно разделить на четыре категории: Умные (Intelligent), Бандиты (Bandits), Безвозмездные (Helpless) и Глупые (Stupid)  с двумя дополнительными категориями: наивный (Naive) и невежественный (Ignorant).

Рисунок 2. 6 типов программистов.

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

С другой стороны, программист-бандит в основном сосредоточен на своей задаче. Его приоритет состоит в том, чтобы оптимизировать его собственную работу за счет других. Такой программист обычно не атакует саму проблему, а скорее борется за то, чтобы ограничить сферу своего назначения (чтобы уменьшить его рабочую нагрузку или получить больше времени), влияя на задания других людей. Кроме того, такой программист жертвует такими качествами кода, как гибкость, производительность, тестируемость, которые в конечном итоге приносят выгоду, ради краткосрочной выгоды, ориентированной на признание руководства. Такой человек обычно смотрит на весь продукт с эгоистичной точки зрения. Чистый эффект их действия может быть положительным или отрицательным в зависимости от того, склоняется ли человек к Умному или Глупому. Кроме того, такие люди часто проявляют чрезмерную уверенность и профессионализм, чтобы поддержать свою незаработанную позицию в организациях (разоблачая горячее или холодное высокомерие). Этих людей обычно называют «ковбойские кодеры».

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

Глупый программист - худший из когда-либо встречавшихся. Это человек, который, как правило, понятия не имеет, что он делает, часто испытывает недостаток в каких-либо навыках, необходимых для программирования, кроме знания языка программирования. Такой человек, как правило, не может предоставить ничего, кроме временных пробелов, которые едва решают адресную проблему. Обычно число дефектов превышает количество реализованных функций, код трудно или даже невозможно протестировать, и это вызывает отрицательные волновые эффекты во всей организации. Низкое (или недостаточное) качество его работы отрицательно влияет как на организацию, так и на него самого, поскольку он часто тратит долгие часы неоплачиваемой сверхурочной работы на решение проблем, с которыми он столкнулся. Такие люди обычно занимают некоторые уголки организации, оставаясь в тени, вне поля зрения руководства. Они никогда не продвигаются вперед и, как правило, счастливы иметь работу. Глупых программистов, так же как и невежественных программистов, привлекают в отрасль только зарплаты. Этих программистов иногда называют «1/10 программистов», так как они могут поставить на колени работу целых команд. Как правило, их не так много, поскольку они в конечном итоге узнаются, но вред, который они наносят, непропорционален их количеству.

Дополнительные два типа программистов - Наивный и Невежественный.

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

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

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

Варвары у ворот

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

Нищета образования

Сначала хотелось бы оспорить утверждение о том, что степень по компьютерным наукам имеет большое значение. Экспоненциальный рост программистов подразумевает экспоненциальный спрос на учителей информатики, и это означает, что отношение опытных учителей информатики к новичкам снова составляет 1: 3. Это означает, что большинство студентов-информатиков обучаются людьми не намного старше, которые обычно вообще не имеют практического опыта (обычно это аспиранты). Есть подозрения, что такое учение редко выходит за рамки «следования книге». Эффект заключается в том, что выпускник CS способен писать код и не намного дальше, так как некому было научить его реальному Software Engineering. Конечно, это верно только в предположении, что количество учеников на одного учителя остается неизменным на протяжении многих лет (в противном случае качество образования падает еще быстрее).

Бесконечное море невежества

Другим важным фактом является несоответствие между тем, что преподается в университетах, и требованиями отрасли. Многие университеты преподают информатику, в то время как промышленность требует навыков разработки программного обеспечения. Проблема в том, что инженерным навыкам зачастую невозможно научиться, и их можно выучить только «на практике». Это означает, что для того, чтобы стать профессионалом в области программной инженерии, нужно потратить первые 10 лет своей карьеры на эксперименты, неудачи, учебе на неудачах и самостоятельное обучение. Это требует неподдельного интереса, преданности и какой-то страсти. Имеет смысл предположить, что распределение этих качеств среди выпускников происходит по колокообразной кривой. Если это так, то только около 20% выпускников тратят первые 10 лет своей карьеры на осознанное обучение, 60% приобретут некоторые знания в процессе, и 20% почти ничему не научатся. Это означает, что через 10 лет только 20% программистов становятся настоящими профессионалами в разработке программного обеспечения. Это формирует еще более пугающий взгляд на отрасль, где число настоящих профессионалов составляет всего 5%. Если предположить, что число бандитов, безвозмездных и наивных среди них составляет 50%, то число так называемых «программистов х10» составляет около 2,5%.

Ошибка колокообразной кривой

Число 2,5% согласуется с распределением колокообразной кривой, где число значений, более отдаленных, чем двойное стандартное отклонение от среднего, составляет 2,1%, но при условии, что распределение компетенции программиста задается стандартной колоколообразной кривой как можно предположить в любой стабильной инженерной области) является ложным. Учитывая, что три трети населения более или менее неопытны, а профессионализм 50% остальных ниже среднего, фактическое распределение компетенций среди программистов сильно смещено в сторону некомпетентности (см. рисунок 2).

Рисунок 3. Распределение компетенций программистов (красная линия) по сравнению с ожидаемыми (синяя линия)

Великое недоразумение

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

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

Культура ботаников

Программистов часто принимают на работу из той части студенческого населения, которая испытывает недостаток в социальных навыках. Как сказал Джеральд М. Вайнберг, «социальные психологи говорят нам, что существуют разные типы личности […]. Среди общих черт личности есть та, которая измеряется по трем «измерениям» - независимо от того, является ли человек «угодливым», «агрессивным» или «отстраненным». Угодливый тип характеризуется отношением «работать с людьми и быть полезным». Агрессивный тип хочет «зарабатывать деньги и престиж», а отстраненный тип хочет «быть предоставленным самому себе и проявлять творческий подход».

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

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

Как утверждает г-н Вайнберг, «одна из наиболее легко определяемых личностных потребностей программистов - это« аккуратность» как небольшое принуждение держать свои документы в порядке […]. Другим важным фактором является […] небольшая доза «смирения», чтобы не дать «программисту освоить несколько простых приемов, почувствовать себя экспертом, а затем сокрушиться от непреодолимой силы компьютера» […]. Другая сторона медали смирения - это «напористость» или сила характера. Задача программиста состоит в том, чтобы делать что-то, а для того, чтобы что-то сделать, иногда нужно преодолевать препятствия, перепрыгивать через них или просто отбрасывать».

Большинство этих препятствий носят не технический, а социальный характер. Они требуют бросать вызов другим людям, выгонять их из зоны комфорта и говорить «НЕТ!» Менеджерам, другими словами, это требует мужества. Многие программисты не знают, как бороться с конфликтом, поэтому они предпочитают избегать его (Наивный и Безвозмездный), внося свою долю к окончательному провалу.

Самоуверенность невежественных

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

Бессилие Лидеров

На другой шкале компетенции сидит еще один тип людей, обладающих синдромом самозванца. Этот психологический феномен касается одаренных людей, достигших высочайшего уровня - бессознательной компетенции. Это «психологический паттерн, в котором человек сомневается в своих достижениях и имеет постоянный интернализованный страх быть разоблаченным как «самозванец». Несмотря на внешние свидетельства своей компетентности, те, кто сталкивается с этим явлением, по-прежнему убеждены в том, что они являются самозванцами и не заслуживают всего, чего они достигли. Люди с самозванством неправильно приписывают свой успех удаче или в результате обмана других, заставляя их думать, что они умнее, чем они себя считают». Это означает, что часть ведущих специалистов (20%, если мы предполагаем нормальное распределение) не могут стать техническими лидерами только потому, что не думают, что они профессионалы. Эти люди предполагают, что проблемы, которые они успешно решают, настолько просты, что это может сделать любой, включая некомпетентных. Они не могут признать некомпетентность своих сверстников или не раскрывают ее, сохраняя статус-кво, что, в конце концов, влияет на них. Это явление касается в основном Безвозмездных и Наивных, а также некоторых Разумных, склонных к безвозмездности.

Развитие чувства вины

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

Почти все терпят неудачу в доставке. Любители терпят неудачу 8 раз из 10. Профессионалы терпят неудачу 2 раза из 10. Программисты неизбежно терпят неудачу в начале своей карьеры. Неудача вызывает чувство вины, и это начало порочного круга, который работает следующим образом:

  1. Программист дает оптимистичное обещание руководству.
  2. Программист не может выполнить обещание.
  3. Программист делает еще одно сверхоптимистическое обещание, чтобы компенсировать свой предыдущий провал.
  4. Он снова терпит неудачу, и цикл повторяется.

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

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

Неизбежный провал Agile

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

  • «Деловые люди и разработчики должны ежедневно работать вместе на протяжении всего проекта» - требует интереса клиента к домену;
  • «Создавайте проекты вокруг мотивированных людей. Дайте им среду и поддержку, в которой они нуждаются, и доверьте им выполнение работы» - требует мотивации и страсти;
  • «Постоянное внимание к техническому совершенству и хорошему дизайну повышает маневренность» - требует компетентности и интеллекта;
  • «Простота - искусство максимизировать объем невыполненной работы - очень важна» - требует также компетентности и интеллекта;
  • «Лучшая архитектура, требования и проекты возникают из самоорганизующихся команд» - требуется компетентность, интеллект и смелость.

Провал гибкой разработки программного обеспечения неизбежен. Предполагая, что количество Умных программистов в отрасли составляет около 2,5% (1/40), а максимальный размер команды SCRUM составляет 9 человек, вероятность того, что средняя команда SCRUM состоит хотя бы из одного Умного, составляет менее 25%. Если команда состоит только из Безвозмездных, Наивных, Бандитов, Невежественных и Глупых, эффект редко бывает положительным.

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

Горькая пилюля

Вот поучительная цитата от Дэвида Парнаса:

«Наиболее часто пропускаемый риск в разработке программного обеспечения - «некомпетентные программисты». Есть оценки, что необходимое в США число программистов превышает 200 000. Это вводит в заблуждение. Это не проблема количества; у нас проблемы с качеством. Один плохой программист может легко создавать две новые работы в год. Наем большего количества плохих программистов только увеличит нашу предполагаемую потребность в них. Если бы у нас было больше хороших программистов, и мы могли бы легко их идентифицировать, нам бы понадобилось меньше, а не больше».

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

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

Тринадцатый принцип

Следуя 12 принципам Agile, можно добавить еще один: «Не нанимайте глупых программистов».

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

Новая надежда

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

No Comments

Add a Comment