Статьи

Так ли ценны менеджеры в IT?

ценность менеджеров

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

Давайте поговорим о работе IT менеджера немного детальнее. Большая часть меджеров приходит работать в компанию на готовый проект, который до этого старательно добывал для компании CEO, CTO, представитель департамента продаж или кто-то еще. Возможно, компания также принимала участие в привлечении средств для финансирования проекта. Таким образом, изначальные вложения менеджера в проект равны нулю. Теперь перейдем к набору сотрудников. Новых людей в проект ищет доблестный HR департамент, собеседовать их и принимать на работу входит в должностные обязанности менеджера, которые ему очень неплохо оплачиваются. Есть конечно редкие исключения, когда менеджер не жалеет сил и на собственном энтузиазме занимается постоением команды (в свободное время).

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

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

Вот и получается, что не за что менеджеру в IT давать возможность получать долгосрочную прибыль от своей работы в качестве наемного сотрудника. Все затраты и риски лежат на компании, поэтому прибыли и убытки также принадлежат компании. Уверен в своих силах? Классный менеджер? Дерзай! Начинай свой проект, ищи финансирование, собирай команду и работай не покладая рук! Вот тогда и обеспечишь себя долгосрочной прибылью, если конечно действительно так крут… ;)

В качестве заключения, хочу отметить, что в современном мире IT роль менеджера проектов переоценена. Ярким примером являются ведущие компании наподобие Facebook, Twitter, Instagram (как же без нее) и прочие. Они полагаются на грамотных технических специалистов и лидеров. Так что не менеджерами едиными… :)

Ошибки проектирования – о подмене постановки задачи решением

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

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

Нужно управлять этим риском хотя бы потому, что задавая вопросы «что вы хотите получить?», «что вам нужно сделать?» вы просто срезаете у своего бизнеса возможность заработать на бизнес-анализе и консалтинге. Потому что вы получаете весьма субъективное мнение владельца идеи или свое собственное. Потом приходит Его Величество Конечный Пользователь на реальном, а не воображаемом рынке и все ставит с ног на голову. Поэтому, гигиена идеи проекта должна заключаться в том, что вопрос «что делать?» должен быть уничтожен во взаимоотношениях заказчик исполнитель – как вне команды, так и внутри её.

Как это выглядит практически:

1. С заказчиком определите главные цели проекта. Выясните, чего он хочет добиться этим проектом и определите критерии достижения цели.

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

3. Проанализируйте путь достижения главной цели – из него появляются дочерние цели.

4. Определите (с заказчиком или уже без него) в общих чертах путь достижения каждой дочерней цели.

5. Проанализируйте …

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

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

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

Какие вы получаете выгоды от такого подхода управления требованиями и дальнейшего проектирования:

1. Резкое сокращение объема работы для заказчика и увеличение объема творческой и высокооплачиваемой работы для себя.

2. Переходя от вопросов «чего надо сделать?» к «чего вы хотите добиться?» вы резко сокращаете влияние субъективного мнения о решении проблемы как вашего, так и заказчика – тот самый риск подмены постановки задачи решением.

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

4. Вы не оставите места такой вредной штуке, как «спящие кейсы» – нет бизнес-целей, нет и фичи.

5. Язык бизнес-целей – это родной язык заказчика, до определенного уровня глубины ни формулировка целей, ни критерии их достижения (путь) не вызовут проблем во взаимопонимании. Верификация перестает быть болью.

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

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

8. У вас есть черновик функциональной карты проекта, связанный с бизнес-целями как пруф вашего понимания бизнес-модели и способности решать бизнес-задачи. Хороший продажник вам так на этой теме денег накосит – мама не горюй :) Такое и инвестору не стыдно показать, и архитектор потом спасибо скажет.

Такие вот практики продуктовой разработки по управлению риском подмены постановки задачи решением :)

Сразу отвечаю на не заданный вопрос: как это относится к продуктовой разработке, если применяются термины «лишаете свой бизнес возможности заработать», «отношения заказчик-исполнитель» и т.д. Хорошо относится. Потому что отношения заказчик – исполнитель вполне себе постоянно возникают внутри любой команды между её участниками и внутри любой компании между командами. Ну а ваша работа в любой компании – это разве не бизнес-модель получения материальной и моральной компенсации за возможности самостоятельно решать проблемы разной степени сложности в различных предметных областях? В это отношении заказная разработка и продуктовая разработка ничем не отличаются – я постоянно это говорю :) Поэтому, вышеприведенные практики смело рекомендую как для продуктовых, так и для команд заказной разработки – проверено и там, там :)

Ошибки проектирования – об абстрактных моделях

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

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

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

Что такое описание предметной области? В умных книжках дается много определений, но мне больше нравится следующее:

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

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

Итак, какими основными рисками позволяет управлять описание предметной области:

0. Риск потери понимания бизнес-модели

Штука, которая страшна для любого проекта, независимо от его величины и сложности. Как только разработчик теряет понимание/ощущение/осязание первоисточника решения, т.е. бизнес-модели использования программного продукта и в проектировании оперирует не терминами предметной области проекта (бизнес-терминами, иными словами), а только классами, методами и интерфейсами – все, приехали. Начинается »клейка танчиков» и «заклепочничество» в чистом виде. Лучше иметь ответы на вопросы «зачем мы это делаем» в максимально простой, компактной и понятной форме. Кто-то может сказать, что он замечательно и без всяких моделей предметной области переводит user-story/use cases/scenarios в программный код. Отлично, а вы спросите его о том, как ответить на вопрос о том, как определить сложность тестирования или определить степень влияния фич друг на друга?

1. Риск потери ценности системы знаний

В любой системе знаний, кроме накопления, систематизации, транзитивности и пр. – есть ещё такая вещь, как обмен знаниями. Чем меньше объем и чем на более высоком абстрактном уровне находится вводная для проекта – тем проще вводить новичка, да и старикам навигацию это упрощает. Такая модель, представленная, как правило, в виде «кружочки + стрелочки + поясняющие надписи» – это очень полезная для команды вещь. Намного полезнее, чем диаграмма классов во всю стену, которая висит в большей степени «для понтов» и «меряний» :)

2. Риск определения момента, когда заказчика можно отпустить

Извечный вопрос: «когда отпускать заказчика?» в управлении требованиями и сценариями поведения. Сторонники гибких методологий скажут «никогда», но реалисты будут искать ответ на этот вопрос :) Имхо, совокупность требований и сценариев поведения/приемки (в каждой методологии они называются по-своему, но их сути это не меняет) для мало-мальски сложного проекта не позволит ни заказчику убедиться в том, что понимание требуемого результата поселилось в голове у исполнителя, ни исполнителю не позволит страховать риски срыва ожиданий заказчика. Нужен промежуточный слой, который бы позволил уже наглядно представить результаты проекта, но ещё не оперировал терминами технических решений – просто заказчик не поймет. Даже технически грамотному заказчику проще общаться в терминах предметной области бизнеса, а не решения.

3. Риск потери управления техническим долгом

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

4. Риск качества перевода с языка бизнеса на язык кода

Имеется ввиду перевод требований и сценариев в рабочий код. Модель предметной области в данном случае – отличная точка входа для управления рисками перевода идеи в реализацию. Хотите – используйте её как трамплин для погружения в DSL и DDD, хотите – просто как артефакт, задающий на высоком абстрактном уровне структуру, иерархию, потоки данных и действий, разделяющий зоны воздействия ролей для удешевления верификации, разработки, планирования и т.д.

5. Риск определения достаточности регрессии функциональных тестов

Вот кто от абстрактных моделей всегда в восторге – это тестировщики. Как ручные, так и автоматизаторы. Вопрос достаточности регрессии при внесении изменений всегда актуален. И определять его можно или путем глубокого анализа сценариев поведения/тестирования, или путем взаимодействия с разработчиком, или самостоятельно. Третий вариант при наличии модели самый экономный по времени и самый безопасный по влиянию решения на тесты. Если вы спросите тестировщика, что ему нужно для входа в проект – в большинстве случаев он ответит «сам проект и что-то вроде карты». Ну и не стоит забывать о мечте любого тестировщика (если вы его ещё не вовлекли в процесс анализа и проектирования) – обратная связь на функциональность проекта. Тут модель приложения в терминах бизнеса – самое то, чтобы начать предлагать изменения.

6. Риск смены решения

Разговоры про эволюцию кода и гибкие архитектуры – вещь классная. Но в бизнесе, как на войне – пушистый зверь может подкрасться незаметно. Например – сменятся аппаратные требования. В разгар кризиса и при развитии Atom платформы они менялись в сторону уменьшения :) Вот и представьте, что вы отрезали от вашей связки «требования – сценарии – реализация» слой реализации. Что при этом произойдет? Правильно – кроме проектирования решения, опять реверс-анализ ввиду непрозрачности связей в сценариях.

7. Риск удорожания внесения изменений

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

8. Риск удорожания стратегического планирования

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

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

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

Более детально о рисках проектирования и о управлении ими, мы поговорим с вами на мастер-классе «Практики эффективного, но экономного проектирования».

Продолжение следует.

Старт проекта. Что такое Управление Конфигурациями?

Продолжаю серию статей «Старт проекта». Первая статья здесь – Старт проекта. Как это делать?

А в этой статье поговорим о дисциплине управления конфигурациями как таковой и о ее важности.

Сразу начну с кейса из реальной жизни:

  • Заказчик прислал проект на оценку в виде нескольких документов, пусть это будут спецификации: «Spec 1 v1_1» и «Spec 2 v1_2»
  • Сделали оценку работ, причем в разделе «References» указали что оценки сделаны на основе этих спецификаций
  • Заказчик согласился на оценку, подписали контракт, собрали команду, начали проект
  • В середине проекта выяснилось, что обещанные сроки выдержать не получается
  • Поначалу «подозрение» пало на некачественный оценку работ
  • Но в конечном итоге выяснилось что: А) – заказчик в начале работ «подсунул» другие спецификации (названия те же, но версии и содержание отличаются); Б) – никто не сверился, отличаются ли изначальные и новые спецификации.

А теперь еще несколько типичных проблем:

  • Устраненные дефекты появляются снова
  • Отсутствуют зафиксированные версии спецификаций, продукта
  • Заказчику отдали старую или неполную версию продукта или его частей
  • Откуда-то появился новый функционал
  • Не совпадают спецификации, продукт и тестовая документация

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

Немного истории. Дисциплина, как и многие другие здравые мысли пришла от военных. Кстати еще о военных, есть статья «История проектного инструментария, нач. ХХв.» – рекомендую. Так вот, как говорит Википедия, дисциплина формализовалась в 1950-х в американских воздушных силах для контроля над компонентами сложных систем. И сейчас применяется во многих отраслях, в том числе и космической. Если говорить о более близких к ИТ вещах, то она постепенно стала компонентом CMMI, ISO 9000, ISO 10007, ITIL, PRINCE2 и т.д.

Собственно определение – Управление конфигурацией (Configuration Management, CM) – это управление наборами рабочих продуктов, их версиями, статусами и взаимосвязями.

Ключевые задачи могут немного отличаться в разных источниках, но если выделить основное, то это:

  • Определение элементов конфигурации
  • Учет состояний и версий
  • Отслеживание запросов на изменение
  • Верификация конфигураций

Причем, о первых трех в списке нужно по возможности договориться на старте проекта, лучше до подписания контракта. Давайте рассмотрим первую задачу – «Определение элементов конфигурации». На протяжении проекта производится множество разных артефактов (Work Products) – спецификации, отчеты, код, результаты инспекции кода, документация пользователя, тест кейсы, скрипты, протоколы совещаний и т.д. Некоторые из них являются Элементами Конфигурации (Configuration Items), а некоторые нет. Если по простому, то Элементы Конфигурации – это наиболее важные артефакты, это могут быть: результаты поставки заказчику; артефакты, от которых зависят другие артефакты и т.п. Например, спецификация – однозначно Элемент Конфигурации, т.к. на ее основании разрабатывается продукт, тестовая документация, делается приемка продукта и т.п. А вот отчет – вряд ли.

Соответственно к Элементам Конфигурации должен применяться структурированный контроль – со второй по четвертую ключевые задачи в списке.

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

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

Серия статей «Старт проекта» выходит в поддержку тренинга «Успешный старт проекта», в котором темы статей рассматриваются подробнее и с практическими заданиями.

Найм сотрудников. Часть 3 – Нежелательные кандидаты.

нежелательные кандидаты

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

Итак, первый тип «плохих» кандидатов – так называемые бегунки. Это люди, которые постоянно меняют работу и не могут проработать на одном месте больше полугода. Когда таких места 2 или 3, это еще не вызывает подозрения. В этом случае можно сослаться на неудачный опыт, быстрый карьерный рост, короткие проекты и т.д. Но если кандидат за 4 года сменил 6-8 проектов, то для меня это практически красный флаг. 

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

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

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

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

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

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

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

Удачного вам найма!

Старт проекта. Как это делать?

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

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

Приведу немного перефразированные случаи из жизни:

  • Стартап, заказчик имеет ограниченный бюджет, которого хватит на несколько месяцев, понимает идею продукта и полностью доступен для коммуникаций. Всем ясно, что за этот бюджет скорее всего можно получить только неплохой прототип, судьбу которого далее решает инвестор.
  • Переделка довольно сложного бизнес приложения на новые технологии. Никакой документации к существующему приложению нет. Бизнес-область компании-исполнителю незнакома. Во что выльется переделка – изначально сложно даже предположить. Но скорее всего много относительно возможностей заказчика. На стороне заказчика есть специалисты по старым технологиям, которые могут в какой-то мере саботировать проект.
  • Поддержка и развитие системы с множеством версий для разных заказчиков. Долгосрочное (годы) сотрудничество, важность накопления знаний внутри команды по предметной области. Наличие другой команды-конкурента, команды могут сравниваться по производительности по количественным показателям. Заказчик диктует свои стандарты кодирования и подход к архитектурным решениям продукта. Довольно большая доля бизнеса для компании-исполнителя.

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

  • Необходимость разбить проект на фазы, например: передачи знаний, выяснения требований, прототипа, проектирования, выполнения, внедрения и т.п. Соответственно в каждой фазе будут совершенно разные результаты работы, состав команды, продолжительность, тип контракта, методология.
    • Когда необходимо разбивать на фазы? Когда требования неясны, новая и сложная предметная область, новая технология, требуется получить точные оценки и планы работ, внедрение или долгое или отложено во времени, заказчик или исполнитель не готов делать сразу весь проект и т.п.
  • Необходимость договориться о процессах работы – это собственно процессы, поддерживающие методологии, стандарты, технологии. Обычно у компании-исполнителя есть определенные внутренние договоренности «как делать» те или иные инженерные и управленческие практики. У заказчика тоже могут быть свои соображения и по поводу процессов, и по поводу методологий, и по поводу инструментария. Сам по себе проект тоже накладывает определенные условия.
    • Задача компании-исполнителя, а особенно ответственного менеджера проекта – установить процессы, которые были бы в первую очередь полезны конкретному проекту, учитывая процессные требования как заказчика, так и компании исполнителя.
  • Необходимость понять политические факторы проекта. Их может быть великое множество. Давайте посмотрим. Кому проект выгоден, а кому может быть и не выгоден? Даже есть такое понятие «murder board». Невыгоден – пользователям заказчика, работу которых автоматизируют, т.е. вероятны сокращения штата; ит-шникам заказчика, которые «застряли» на устаревших технологиях или дорого обходятся заказчику; представители подразделений и других проектов заказчика, у которых ваш проект «отбирает» финансирование, т.е. те, кто напрямую не заинтересован в проекте. Со стороны компании-исполнителя тоже может быть набор политических факторов, таких как приоритетность заказчика или направления бизнеса среди других; состояние финансовых и договорных отношений; наличие и квалификация специалистов определенного направления и т.п.
    • По политическим факторам скорее всего нужно уделить внимание двум аспектам: а) скажем так – психологической готовности их нейтрально воспринимать; б) выбору правильных способов коммуникации и эскалации, причем с уклоном в более формальные методы.

В следующей статье рассмотрим дисциплину Управление Конфигурациями, и почему важно уделить ей внимание на старте проекта.

Оригинал статьи здесь.

Ошибки проектирования

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

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

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

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

Это не работает. Это просто приведет к тому, что у нас будет 100% покрытие зелеными тестами, например, но свободный поиск руками покажет, что фича негодна. С такими всплесками нужно бороться. Например – ни одна практика не внедряется без экономического обоснования с точки зрения целей проекта, а не процесса. Потому что под процесс всегда можно оправдать :) А вы попробуйте честно доказать друг-другу, например, что TDD вам нужна в первую очередь как инструмент уточнения требований, а уж потом – как средство повысить качество кода. Очень много интересного узнаете о том, как вы управляете требованиями и почему у вас они часто меняются.

Ценность agile практик, кстати, как раз в том и заключается (в том числе), чтобы убрать культы, но человек слаб, поэтому он часто возводит уже agile в культ. :)

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

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

Крамольная мысль №3 – наличие выделенного архитектора во много крат повышает влияние риска «любимого ребенка» и вместо реальной помощи при адаптации архитектуры под изменения требований бизнеса – начинается игра не в те ворота. Как часто вам главные архитекторы тормозили процесс изменений и рассказывали, что это сложно, невозможно и очень трудно тестировать? И ведь под благим предлогом – нам нельзя дестабилизровать проект и т.д. и т.п.

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

Иными словами, архитекторы – это опытные разработчики, которых подпирает бизнес-аналитик, не позволяя увлечься сферическим конем в вакууме, постоянно напоминая о реальных критериях качества, а не о чистоте архитектурных решений, паттернах и иерархии классов. При этом, завершив этап архитектуры, эти разработчики начинают получать обратную связь о качестве этой архитектуры путем использования – самы хороший вид обратной связи. Кстати, самая навороченная из Agile методик – Feature-Driven Development, как раз и оперирует группами архитекторов (Chief Developers).

Продолжение следует…

Стоит ли задавать вопросы с примерами кода на собеседовании?

вопросы на интервью

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

Мне данный подход кажется более чем неправильным. Я не призываю спрашивать наизусть заученные названия классов и методов. Это как раз можно решить с помощью IDE и того же Google. Но вот в какую сторону копать надо знать четко. Особенно если именно в этой области вам предстоит работать достаточно долго.

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

А если начать искать, то в топе будут обычные классические примеры на «чистой» Java или другом языке программирования. И что происходит дальше? Человек просто копирует решение к себе и не переживает. Откуда ему знать про Java Concurrency API, про Google Guava и другие полезные библиотеки? Что получается в итоге? Куча времени на поиск и понимание решения, бездумное копирование и минимум новых знаний. Потом это решение в коде находит грамотный разработчик и исправляет его на более быстрое, надежное и грамотное. А за все уже заплачено!

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

Еще один банальный пример из Java мира – поиск в строке. Казалось бы безобидный поиск, но каждый раз создается и компилируется шаблон регулярного выражения, что замедляет работу метода в десятки раз. Это нереально найти, если ты заранее не знаешь о таком поведении. Логично ли задать такой вопрос для проекта, где работа со строками идет очень интенсивно? Или лучше потерять потом часы и дни на отладку и тюнинг производительности?

Приведу еще один пример, более «бытовой». Все знают, что ORM библиотеки умеют подгружать коллекции дочерних элементов автоматически по заданному маппингу. Но задумается ли человек, который не изучал как работает используемый в вашем проекте ORM инструмент, как и когда это происходит? Я думаю нет! И, в итоге, код будет делать сотни запросов в базу данных по совершенно простому действию с коллекцией (к примеру поиску по ней). И ничего не будет предвещать беды, пока приложение не будет под реальной нагрузкой. Стоит ли разбирать такие куски кода на собеседовании, если ORM у вас используется очень активно? Думаю да!

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

Размышления вслух на тему рынка IT в Украине

IT аутсорсинг Украины

Давно собирался написать на тему нашего аутсорсинга, но все не хватало времени. На пляже его вдоволь, поэтому немного пофилософствую. 

Начну я с одной реальной истории, не имеющей отношение к миру IT. Слышал ее в какой-то передаче по Discovery. Она про один замечательный красивый остров в океане. Он был очень густо заселен лесом. И люди решили продавать лес, в связи с чем начались массовые вырубки. Естественно, никто не думал о новых посадках или экологии – ведь надо было рубить бабло. И все больше людей занимались этим бизнесом, перекупая лес, землю и готовую древесину. Чем меньше леса оставалось, тем дороже он стоил. Но это никого не волновало – ведь можно было просто продавать больше и дороже, получая ту же прибыль. 

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

Теперь вернемся к нашему рынку IT. Компании на нашем рынке ведут бизнес «по-украински», плюя с высокой колокольни на будущее индустрии в Украине. Бабло нужно колотить сегодня и сейчас. А завтра будет завтра. Поэтому они переманивают сотрудника за +X к зарплате и не задумываются о последствиях. А последствия очень печальны – растут зарплаты и запросы у разработчиков. Мы пилим сук, на котором сами сидим. Очень скоро работать с Украиной станет просто невыгодно.

При этом качество разработчиков с каждым годом становится все печальнее. Да и зачем развиваться? На перегретом рынке можно запросто перескочить на +500 к зарплате просто потому, что на очередном «фабричном» проекте появились 20 горящих вакансий. Доходит до абсурдного – люди с 5 годами опыта на собеседовании ничего не знают и не могут написать простейший код в IDE. А ожидания по зарплате выше среднего по рынку. И в глазах немой вопрос: «А зачем мне уходить с текущего места, где я в команде из 40 человек ни черта не делаю и получаю XXX?».

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

Но вместо этого все только жалуются на жизнь и считают каждый потраченный доллар на публичное мероприятие. Компания на 500+ сотрудников «серьезно задумывается» дать ли $1000 на поддержку конференции. Это просто смешно! Не хотите поддерживать чужие мероприятия? Делайте свои! Делайте много и в разных областях! Делайте бесплатными или почти бесплатными! Делайте большие обучающие программы дешево и качественно! Просто развивайте рынок!

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

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

Когда я был в Индии, мне удалось пообщаться с семьей, сын которой учится на программиста. Они все гордятся его специальностью, а он прилагает максимум усилий для учебы. А у нас? Никто не хочет учиться! Всем откровенно наплевать на развитие. Научился писать хоть как-то – добро пожаловать на «фабрику» и получать бабло! Ситуацию надо менять иначе может быть уже слишком поздно…

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

Несколько вещей, которые я выучил из проекта IdeaStrike

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

Мое внимание, на этот раз привлек проект IdeaStrike. Это аналог известного продукта uservoice для Open Souce (OS) коммюнити. Как всегда, первый релиз был сделан очень быстро (за неделю) и мне было очень интересно посмотреть, что внутри? Поэтому, я клонировал их репозиторий и провел небольшую хак-сессию. Я потратил пару часов, и теперь хочу поделится некоторыми интересными находками.

Билд скрипты – маленькие и понятные

Проект включает build.cmd. При его запуске, он скачал все зависимости через NuGet, построил сайт и запустил все юнит тесты. Это, в общем, все что вам необходимо, для маленьких проектов. Когда, я заглянул внутрь, то увидел:

@echo Off
set config=%1
if "%config%" == "" (
   set config=Debug
)

%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.proj /p:Configuration="%config%" /t:AppHarbor /m /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:false

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

Использование NuGet пакетов, без добавления из в SCM

Я крайне удивился, как быстро был склонирован репозиторий! Как выяснилось, папка packages была оригинально пуста. Как известно, библиотеки зависимостей, это основной «груз», который препядствует быстрому клонированию. Как это может быть? Как я сказал в пункте.1, как только я запустил билд скрипт, то все пакеты загрузились автоматически. Как выяснилось, что фича NuGet’a, которая позволяет работать с зависимостями, без необходимости добавлять из под контроль версий. Это очень круто, особенно для больших проектов, где клонирование и бранчи могут стать более затяжной операцией. Детали реализации такого повередения, описаны в документации на NuGet сайте.

Развертывание базы данных приложения, на первом запуске

IdeaStrike использует EF 4.3 Beta 1, через Code First подход. EF Code First также включает в себя классную фичу, под названием Migrations (Миграции). Это именно та фича, которой так недоставало EF Code First, когда я первый раз пробывае его в деле. Мы опеределяем Context, DbConfiguration класс и миграционные скрипты (которые представляют собой просто C# код) и при инициализации приложения, вызываем:

private static void DoMigrations()
{
    var settings = new IdeastrikeDbConfiguration();
    var migrator = new DbMigrator(settings);
    migrator.Update();
}

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

Социальный логин с Janrain

Когда я кликнул «Sign In» кнопку, то увидел приятный диалог, с которым можно было зайти на сайт, используя свой текущий социальный аккаунт.


social login

JanRain оказался очень крутым решением. Я помню, когда-то я пытался найти, что-то подобное для ASP.NET MVC и был очень разочарован тем фактом, что не нашел ничего стоящего. Для всех существующих решений, требовалось изучать OAuth протокол и писать код. JanRain делает всю грязную работу. Как только юзер авторизован, вызывается POST по заданному URL, который содержит специальный токен. По этому токену, можно запросить все необходимые детали, по данному пользователю, как имя, електронный адрес и т.д. (смотри LoginModule.cs). У них чесные планы для хобби проектов и блоггеров.

Bootstrap для CSS и HTML

Bootstrap это не самое новое и не уникальное решение на данный момент, я как минимум знаю еще несколько хороших CSS/HTML фреймворков. Но IdeaStrike доказывает в очередной раз – нет смысла изобретать колесо. Использование результатов работы людей, которые умнее вас, это истинное правило прагматичного разработчика.

«Будующий Я», пожайлуйста, никогда больше не начинай свое приложение HTML/CSS с чистого листа, полученный результат все равно будет – фигня. Bootstrap, великолепное решение для всякого рода проектов и прототипов. Принимая во внимание количество «наблюдателей» и «форков» проекта на гитхабе, я могу ожидать новых улучшений и фич, в ближайшем будущем.

Nancy как веб фреймворк

Я слышал про Nancy несколько раз, но до этого мне не доводилось его потрогать. Для меня Nancy это просто альтернативная реальность, по сравнению с ASP.NET MVC. Не сложно понять, что делает код. Не сложно его изменять. Все довольно прозрачно: опеределяете HTTP verb, раут и действие, как лямбду. Самый главный класс в Nancy это Module, вся логика модуля расположенна в конструкторе:

public FeatureModule(IIdeaRepository ideas, IFeatureRepository features, IUserRepository users)
    : base("/idea")
{
    _ideas = ideas;
    _features = features;

    this.RequiresAuthentication();

    Post["/{idea}/feature"] = _ =>
    {
        int id = _.Idea;
        var feature = new Feature
                        {
                            Time = DateTime.UtcNow,
                            Text = Request.Form.feature,
                            User = Context.GetCurrentUser(users)
                        };
        _features.Add(id, feature);

        return Response.AsRedirect(string.Format("/idea/{0}#{1}", id, feature.Id));
    };
}

Приложения Nancy могут хостится, как ASP.NET / WCF / SelfHosted, а также на любом хосте поддерживающи OWIN. Доступны несколько View Engines (включая Razor). Больше делатей на Nancy гитхаб аккаунте.

Заключение

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

NancyFX, вероятно станет следующим фреймворком, который я буду изучать, так как мне уже пора выходить из комфортной зоны ASP.NET MVC. Я продолжаю следить за развитием IdeaStrike и уже сделал несколько важных пул реквестов. Надеюсь у проекта интересное будущее!

Оригинал статьи – http://www.beletsky.net/2012/02/few-things-i-learned-from-ideastrike.html.