процесс разработки


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

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

Когда ротация нужна

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

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

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

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

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

Когда ротация не нужна

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

  1. В команде не делается рецензирование кода (code review). Если у вас не делается регулярного рецензирования кода, то я настоятельно рекомендую забыть о ротации и заняться рецензированием. Если вы не проводите рецензирование кода, это означает что:

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

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

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

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

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

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

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

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

Прочел вот здесь:

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

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

Затронуто, по сути, два вопроса - о единице планирования и о ротации разработчиков. Сегодня я расскажу про планирование.

О единице планирования

Много написано о том, что работы в плане должны быть максимально подробными. Джоэль Спольски, насколько я помню, пишет о 8-16 часах как о максимальной длительности, после которой задачу надо дробить на несколько более мелких. Техника действительно полезная, но там акцент делался на персональном планировании или, на худой конец, о группе из 2-3 человек.

Ну а если пытаться делать то же самое в относительно крупном проекте?

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

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

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

В следущее утро ему досталась задача по модификации билд-файлов и перенастройке билд-сервера. Что ж, надо опять лезть в документацию… Через пару часов прибегает взмыленный тестер – выясняется, что написанный в понедельник Ajax-код, некорректно работает в седьмой версии Internet Explorer, а в 6-й версии и Опере не работает совсем. Документация по билдам заброшена и вдвоем с хорошо разбирающимся в Ajax коллегой Константин к концу дня таки исправляет этот чертов глюк.

В пятницу утром прибегает тестер, проверявший функцию комментирования…

Ну как вам такой распорядок?

“Да вообще отвратительно, убила бы такого руководителя” - одна моя хорошая знакомая.

В чем ошибка?

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

  2. Планы должны быть предсказуемы. Когда человек не знает, что он будет делать завтра – это нонсенс. Не меньше половины ключевых идей для решения какой-то проблемы возникает у людей в «фоновом режиме», пока они работают над предыдущими задачами. Если человек не знает что через неделю он будет решать задачу X, то он легко может думать «в фоне» о решении для задачи Y. А решать придется задачу Z, про которую он не думал вообще. В итоге качество решений, требующих тщательного обдумывания снизится в проекте где-то в два раза. Оно вам надо?

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


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

Next Page »