WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 || 3 | 4 |

«Краткое содержание О серии ХР 12 Предисловие 13 Введение 15 Часть 1. Проблема Глава 1. Риск: основная проблема 24 Глава 2. Эпизод из программистской практики 28 Глава 3. Экономика разработки ...»

-- [ Страница 2 ] --

Эрих Гамма (Erich Gamma) придумал термин «инфицированный те стами» (Test Infected) для описания людей, которые не приступают к ко Тестирование дированию до тех пор, пока у них не будет набор тестов для проверки разрабатываемого кода. Тесты сообщают вам о том, что ваша работа за вершена, — когда все тесты сработали, считайте, что на данный момент кодирование успешно завершено. Когда вы больше не можете придумать ни одного теста, можете считать, что вы завершили работу.

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

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

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

Один из принципов предписывает, что необходимо работать совмест но с природой человека, а не против нее. Если тестирование подкрепля ется только лишь одним долгосрочным аргументом, об этом аргументе можно легко позабыть. В этом случае многие будут заниматься тестиро ванием только потому, что они обязаны это делать, или потому, что кто то тщательно контролирует правильность их работы. Как только внима ние надсмотрщика ослабевает, или в случае, если сроки сдачи работы 72 Глава 9 • Обратно к истокам стремительно приближаются, разработка новых тестов прекращается, уже имеющиеся тесты перестают запускаться, и в результате вся система раз валивается на части. Таким образом, если мы хотим работать сообразно с человеческой природой и при этом мы хотим обеспечить тестирова ние, мы должны найти для тестирования краткосрочную эгоистическую причину.

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

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

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

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

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

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

Заглядывая вперед, отмечу, что в дальнейшем разговор пойдет о двух наборах тестов. Тесты модулей (unit tests) разрабатываются программи стами для того, чтобы убедиться в корректной работе разрабатываемого ими кода. Функциональные тесты (functional tests) разрабатываются (или по крайней мере специфицируются) заказчиками для того, чтобы убедить ся в том, что система как единое целое работает именно так, как она долж на работать.

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

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

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

К чему я веду? Если вы решили тестировать, вы должны получить от куда-либо ожидаемые ответы. Так как вы (программист) ничего не знае те, вы должны спросить у кого-то еще. Они сообщат вам, какие ответы являются ожидаемыми и какие случаи являются необычными с точки зре ния бизнеса.

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

74 Глава 9 • Обратно к истокам Программисты должны слушать с большим вниманием. Они должны услышать от заказчика суть бизнес-проблемы. Они должны помочь за казчику понять, что является простым, а что — сложным, это можно счи тать активной формой слушания. Обратная связь от программистов к за казчику помогает заказчику самому лучше понять суть стоящей перед ним проблемы.

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

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

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

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

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

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

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

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

• кодирование;

• тестирование;

• слушание;

• проектирование.

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

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

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

• история об управлении автомобилем;

• четыре ценности — коммуникация, простота, обратная связь и храб рость;

• принципы;

• четыре базовые активности — кодирование, тестирование, слушание и проектирование.

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

Нет проблем.

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

Краткий обзор Для начала перечислю все методики.

• Игра в планирование (planning game) — быстро определяет перечень задач (объем работ), которые необходимо реализовать в версии продукта. Для этого рассматриваются бизнес-приоритеты и технические оценки. Если со временем план перестает соответство вать действительности, происходит обновление плана.

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

• Метафора (metaphor) — эта простая общедоступная и общеизвест ная история, которая коротко описывает, как работает вся система.

Эта история управляет всем процессом разработки.

• Простой дизайн (simple design) — в каждый момент времени систе ма должна быть спроектирована так просто, как это возможно. Чрез мерная сложность устраняется, как только ее обнаруживают.

• Тестирование (testing) — программисты постоянно пишут тесты для модулей. Для того чтобы разработка продолжалась, все тесты долж ны срабатывать. Заказчики пишут тесты, которые демонстрируют работоспособность и завершенность той или иной возможности си стемы.

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

• Программирование парами programming) — весь разрабатывае мый код пишется двумя программистами на одном компьютере.

• Коллективное владение (collective ownership) — в любой момент вре мени любой член команды может изменить любой код в любом ме сте системы.

• интеграция (continuous integration) — система интег рируется и собирается множество раз в день. Это происходит каж дый раз, когда завершается решение очередной задачи.

• 40-часовая неделя (40-hour week) — программисты работают не бо лее 40 часов в неделю. Это правило. Никогда нельзя работать сверх урочно две недели подряд.

• Заказчик на месте разработки (on-site customer) — в состав команды входит реальный живой пользователь системы. Он доступен в тече ние всего рабочего дня и способен отвечать на вопросы о системе.

80 Глава 10 • Краткий обзор • Стандарты кодирования (coding standards) — программисты пишут весь код в соответствии с правилами, которые обеспечивают ком муникацию при помощи кода.

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

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

Представители бизнеса должны принимать решения в следующих об ластях.

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

• Приоритет — если с самого начала вы можете реализовать только возможности А или В, то какую из них следует реализовать в пер вую очередь? Ответ на этот вопрос должен быть определен в пер вую очередь представителем бизнеса, а не программистом.

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

• Сроки выпуска версий — в какие важные даты очередные версии про граммного продукта должны появляться в производстве?

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

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

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

• Последствия — существует набор бизнес-решений, которые следу ет формировать, только ознакомившись с технологическими по Небольшие версии следствиями. Хорошим примером является выбор той или иной технологии управления базой данных. Бизнесу лучше иметь дело с крупной компанией, а не с новичками, однако и здесь существу ет набор факторов, которые необходимо тщательно изучить, так как, возможно, сотрудничество с компанией, появившейся на рын ке недавно, оправданно по тем или иным причинам. Возможно, све жая, недавно разработанная система управления базой дает двукратный рост производительности. Возможно, разработка ре шения на основе этой базы данных обойдется бизнесу в два раза дешевле. Таким образом, риск, связанный с использованием новой технологии управления базой данных, вполне оправдан. А возмож но, и нет. Разработчики должны объяснить последствия того или иного решения.

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

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

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

Лучше планировать на месяц или два вперед, чем планировать на пол года или год вперед. Компания, которая за один раз передает в руки за казчика достаточно крупный программный продукт, не может выпускать очередные версии этого продукта достаточно часто. Эта компания долж 82 Глава 10 • Краткий обзор на сократить время работы над очередной версией настолько, насколько это возможно.

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

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

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

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

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

Простой дизайн В каждый момент времени правильным является дизайн системы, в рам ках которого:

Выполняются все тесты.

2. Нет дублирующейся логики. (Опасайтесь скрытого дублирования, например, применения параллельных иерархий классов.) Тестирование 3. Выражается каждая из идей, важных для программистов.

4. Существует наименьшее возможное количество классов и методов.

Каждый фрагмент дизайна системы должен доказать свое право на существование на основании всех перечисленных правил. Эдвард Туфт (Edward Tufte) придумал упражнение для разработчиков графов — на рисуйте граф так, как хотите, затем стирайте до тех пор, пока вы не удаляете из графа полезную информацию. Если вы не можете больше продолжать стирание, значит, перед вами наиболее удачный дизайн для графа. Простой дизайн программной системы можно сформировать точ но таким же образом — уберите из системы все элементы, какие вы смо жете убрать, не нарушив при этом правил 1-3.

Edward Tufte, The Visual Display of Quantitative Information (Визуальное отображение численной информации), Graphics Press, 1992.

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

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

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

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

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

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

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

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

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

• Сработает ли используемый подход в целом?

• Какими могут быть другие, еще не рассмотренные тестовые случаи?

Коллективное владение • Существуют ли какие-либо способы упростить всю систему таким образом, что текущая проблема просто исчезнет?

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

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

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

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

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

В рамках ХР ответственность за весь код системы лежит на всех чле нах команды. Нельзя сказать, что каждый член команды хорошо знает 86 Глава 10 • Краткий обзор каждую часть кода, однако можно сказать, что каждый член команды зна ет, по крайней мере, что-то о каждой части. Если пара программистов ра ботает над решением некоторой задачи и видит, что для упрощения рабо ты требуется внести модификации в некоторую часть кода, тем самым улучшив этот код, изменения вносятся немедленно, благодаря чему реша емая этой парой задача упрощается.

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

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

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

Конечно же, для этого необязательно, чтобы рабочих часов в неделе было бы ровно 40. Разные люди способны эффективно работать в тече ние различного времени. Один человек не может концентрировать свое внимание дольше, чем в течение 35 рабочих часов, другой способен ус пешно действовать в течение 45 часов в неделю. Но никто не способен работать по 60 часов в неделю на протяжении многих недель и при этом Заказчик на разработки оставаться свежим, творческим, внимательным и уверенным в своих си лах. Ни в коем случае не делайте этого!

Работа во внеурочное время — это признак серьезных проблем в про екте. В рамках ХР действует очень простое правило — нельзя работать во внеурочное время две недели подряд. В течение одной недели можно под напрячься и поработать несколько лишних часов. Но если в очередной понедельник вы приходите на работу и объявляете: «Чтобы достичь по ставленных целей, мы должны снова работать допоздна», это означает, что у вас возникли проблемы, которые вы не сможете решить простым увеличением рабочего времени.

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

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

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

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

Кроме того, утверждение, что представитель заказчика, работающий вместе с командой, не может заниматься некоторыми своими повседнев 88 Глава 10 • Краткий обзор делами, на самом деле не верно. Даже такие творческие люди, как программисты, не могут генерировать вопросы непрерывно в течение 40 ча сов каждую неделю. Конечно, сотрудник предприятия-заказчика обладает тем недостатком, что он физически удален от тех людей, с которыми он должен взаимодействовать, однако при этом у него будет достаточно вре мени для выполнения некоторой своей обычной работы.

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

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

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

Стандарт должен требовать от разработчиков приложения минимально возможных усилий для реализации той или иной возможности. Он дол жен способствовать воплощению на практике правила трех О — Once and Only Once (запрет на дублирование кода). Стандарт должен способство вать коммуникации. Наконец, стандарт должен быть добровольно воспри нят всей командой разработчиков.

это работает?

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

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

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

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

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

90 Глава И • Как это Игра в планирование Вы не можете начать работу над проектом, имея на руках лишь грубый, нечеткий план предстоящей работы. Вы не можете постоянно обновлять ваш план — это потребовало бы слишком много времени, и в результате заказчики остались бы недовольны. Однако в ХР:

• заказчики выполняют обновление плана самостоятельно, на основа нии оценок, которые делаются программистами;

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

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

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

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

Небольшие версии Вы не можете приступить к эксплуатации системы уже через несколько месяцев работы над проектом. Вы определенно не можете выпускать но вые версии системы каждый день или каждые несколько месяцев. Одна ко в ХР:

• игра в планирование помогает вам работать над наиболее важными историями, поэтому даже небольшая система в состоянии приносить пользу бизнесу;

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

• в процессе разработки вы постоянно выполняете тестирование сис темы, благодаря этому количество дефектов в системе настолько мало, что вам не требуется заниматься длительным и болезненным предпродажным тестированием продукта перед тем, как вводить его в эксплуатацию;

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

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

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

• вы обладаете быстрой и надежной обратной связью, благодаря чему вы на основании реального кода и тестов узнаете о том, работает ли метафора на практике;

• вашему заказчику очень удобно разговаривать о системе в терми нах метафоры;

• вы выполняете переработку (refactor) для того, чтобы постоянно пересматривать ваше представление о том, что метафора означает на практике.

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

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

• вы привыкаете к постоянной переработке кода, благодаря чему вне сение в дизайн системы не представляет для вас сложностей;

• вы обладаете понятной всеобщей метафорой, благодаря чему вы мо жете быть уверенными в том, что любые изменения в дизайне будут выполняться в рамках единого пути, сходящегося в одной точке;

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

92 Глава 11 • Как это работает?

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

Тестирование Вы не сможете написать все эти тесты. Для этого потребуется слишком много времени. Мало того, программисты не любят писать тесты для про грамм, они любят разрабатывать сами программы. Однако в ХР:

• дизайн системы настолько прост, насколько это вообще возможно, поэтому разработка тестов — это не такая уж сложная процедура;

• вы программируете не один, а вместе с партнером, поэтому если у вас нет возможности придумать еще один тест, этим может заняться ваш партнер, а если партнеру кажется, что он может нарушить работу теста, вы можете просто передать ему клавиатуру;

• вам становится приятно, когда вы видите, что все тесты работают;

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

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

Переработка кода Вы не можете постоянно перерабатывать дизайн системы. Для этого по требуется слишком много времени, переработку будет сложно контроли ровать, кроме того, в процессе переработки вы с большой долей вероят ности можете серьезно нарушить работу системы. Однако в ХР:

• используется модель коллективного владения кода, поэтому вас не настораживает необходимость внесения в систему изменений тогда, когда в этом возникает необходимость;

• используются стандарты кодирования, благодаря чему вам не при ходится реформатировать код перед тем, как осуществлять перера ботку;

• вы программируете парами, поэтому вам не страшно приступать к переработке кода в одиночку, кроме того, благодаря программиро ванию в парах вероятность того, что вы нарушите работоспособность системы, снижается;

Программирование в парах • вы используете простой дизайн, поэтому переработка кода выпол няется проще;

• у вас есть тесты, поэтому вряд ли вы нарушите целостность кода, не узнав об этом сразу же;

• вы постоянно выполняете интеграцию системы, поэтому если вы нечаянно нарушите что-либо в системе или выполненная вами пе реработка конфликтует с чьей-либо работой, вы узнаете об этом в течение ближайших нескольких часов;

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

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

Программирование в парах Вы не можете программировать парами. Двум людям очень сложно писать один и тот же код. Это слишком медленно. Кроме того, вам кажется, что два человека по отдельности на двух разных компьютерах напишут в два раза больше кода, чем вместе на одном компьютере. Однако в ХР:

• стандарты кодирования снижают трения между членами пары;

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

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

• пары используют метафору для формирования таких решений, как именование элементов системы и базовый дизайн;

• пары работают в рамках простого дизайна, поэтому оба программи ста в паре без затруднений понимают, что, собственно, происходит.

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

94 Глава 11 • Как это работает?

Коллективное владение Вы не можете разрешить каждому члену команды вносить любые измене ния в любое место системы в любое удобное для этого время. В результа те этого программисты немедленно разбросают код направо и налево и стоимость интеграции стремительно вырастет. Однако в ХР:

• интеграция выполняется очень часто, каждые несколько часов, по этому вероятность конфликтов снижается;

• вы пишете и постоянно запускаете тесты, поэтому вероятность на рушения работы системы снижается;

• вы программируете в парах, поэтому вероятность ошибок снижает ся и программисты понимают код быстрее, чем могут его изменить;

• вы действуете в рамках стандартов кодирования, поэтому конфлик ты стиля не возникают, а код становится понятным каждому члену команды (например, ситуация, когда разные люди привыкли ста вить фигурные скобки по-разному, называется Curly Brace Wars — война фигурных скобок).

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

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

• вы можете запустить тесты и быстро убедиться в том, что все работает;

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

• вы выполняете переработку кода, и в процессе этого устраняется значительная часть конфликтов.

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

Заказчик на месте разработки 40-часовая рабочая неделя Вы не можете работать только 40 часов в неделю. Вы не успеете выпол нить весь необходимый объем работ. Однако в ХР:

• игра в планирование заставляет вас делать наиболее важную работу в первую очередь;

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

• весь набор рассматриваемых методик помогает вам программиро вать с максимальной скоростью, поэтому вы все равно не сможете сделать запланированный на неделю объем работ быстрее.

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

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

• представитель заказчика приносит пользу для проекта, так как он пишет функциональные тесты (предприятию-заказчику все равно придется этим заниматься);

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

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

96 Глава 11 • Как это работает?

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

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

Заключение Любая из рассмотренных методик сама по себе плохо приспособлена для использования в рамках программистского проекта (за исключением, воз можно, тестирования). Чтобы обеспечить их эффективное применение на практике, вы должны использовать их все одновременно. На рис. 4 изобра жена диаграмма, которая иллюстрирует взаимодействие всех методик.

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

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

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

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

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

И вновь мы должны вернуться к принципам, которые помогут нам про ложить путь между двумя крайностями.

98 Глава 12 • Стратегия менеджмента • Принимаемая ответственность, — в соответствии с этим принципом обязанность менеджера состоит не в том, чтобы назначить ту или иную работу тому или иному человеку, а в том, чтобы указать коман де на необходимость выполнения этой работы.

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

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

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

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

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

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

Метрики Метрики Основным инструментом оценки в ХР является метрика. Например, от ношение ожидаемого времени разработки к календарному времени яв ляется базовой мерой оценки в ходе игры в планирование. Эта мера по зволяет команде установить проекта (Project Velocity). Если отношение увеличивается (меньшее количество календарного времени для заданного ожидаемого объема разработки), это означает, что работа команды продвигается успешно. Или это может означать, что команда не делает ничего, кроме удовлетворения требований;

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

Средой отражения состояния метрик является наглядная диа грамма (Big Visible Chart). Вместо того чтобы посылать всем членам ко манды электронное письмо (которое зачастую будет ими игнорировать ся), менеджер должен периодически (не реже чем раз в неделю) обновлять видимую для всех диаграмму. Зачастую подобное вмешательство просто необходимо. Вы полагаете, что написано недостаточное количество тестов?

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

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

Со временем метрики теряют актуальность. На практике любая метри ка, значение которой приблизилось к отметке 100%, перестает быть по лезной. Это замечание, конечно же, не относится к показателю тестов мо дулей. Этот показатель всегда должен равняться 100%. Однако показатель тестов модулей — в большей степени предположение, а не метрика. Вы не можете отметить на диаграмме, что показатель функциональных те стов равен 97%, имея в виду, что осталось приложить усилия в размере 3%. Если значение метрики приближается к 100%, замените ее другой мет рикой, которая, по вашему мнению, снизилась на несколько пунктов.

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

100 Глава 12 • Стратегия менеджмента Инструктирование То, что многие понимают под менеджментом, в ХР делится на две роли:

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

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

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

Инструктор не принимает на себя ответственность за множество тех нических задач. Скорее, его обязанности заключаются в следующем:

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

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

• помогать программистам индивидуальными техническими навыка ми, например тестированием, форматированием и переработкой;

• объяснять процесс разработки менеджерам высшего звена.

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

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

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

Роб Мии (Rob Мее) пишет.

Эти наборы тестов очень коварны. В моей команде мы практикуем вознаграждение самих себя едой и питьем за успешно завершенное тестирование. Например, в 14:45 я говорю:

«Если мы закончим с этим до 15:00, мы сможем перекусить и выпить чаю». Конечно же, мы сможем перекусить в любом случае, даже если тестирование затянется вплоть до Однако мы не будем есть до тех пока все тесты не сработают, — если у нас есть задача и цель, к которой мы стремимся, то перекус, который мы осуществляем, достигнув цепи, превращается в маленькое празднество.

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

Слежение за ходом дел в ХР осуществляет ревизор (tracker). Ревизор собирает сведения о состоянии метрик, которые отслеживаются в данный момент, кроме того, он следит за тем, чтобы все члены команды знали о том, какие метрики в данный момент отслеживаются (также он напо минает о ранее сделанных предположениях и оценках).

Ведение игры в планирование — это часть слежения. Ревизор должен отлично знать правила игры и быть готовым применить их в различных эмоциональных ситуациях (планирование всегда эмоционально).

Слежение должно осуществляться без лишних трудозатрат и неудобств.

Если ответственное лицо по два раза на дню будет спрашивать у 102 Глава 12 • Стратегия менеджмента стов о текущем состоянии их дел, в скором времени программисты начнут уклоняться от такого контроля. Напротив, ревизор должен эксперименти ровать, чтобы выяснить, какой минимальный объем измерений необходи мо выполнить для того, чтобы при этом не утратить эффективности и ак туальности этих измерений. Сбор реальных данных о разработке дважды в неделю — этого вполне достаточно. При более интенсивных измерениях вы вряд ли получите лучшие результаты.

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

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

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

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

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

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

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

Рон Джеффрис (Ron Jeffries) писал о фотографии, показанной на рис. 5.

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

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

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

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

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

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

Правильная организация рабочих помещений — это в любом случае непростая работа. В этой области существует большое количество конф ликтующих ограничений. Планировщики рабочих помещений стараются 106 Глава 13 • Стратегия организации рабочего места потратить как можно меньше денег и при этом обеспечить как можно боль шую гибкость. Люди, использующие эти помещения, желают работать в тесной связке с остальной командой. В то же время они нуждаются в не котором отделенном от остальных людей индивидуальном пространстве, из которого они могли бы (например) звонить в приемную своей поли клиники.

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

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

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

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

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

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

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

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

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

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

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

108 Глава 13 • Стратегия организации рабочего места Мебель и рабочие помещения могут быть предметом постоянного экс периментирования (еще одна ценность — обратная связь — в действии).

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

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

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

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

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

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

Как правило, наименее важные требования являются причиной наиболь шего риска. Похоже, это является следствием их природы. Они меньше 110 Глава 14 • Разделение полномочий между технарями и бизнесменами всего обдумываются, меньше всего анализируются и меньше всего осмы сливаются, поэтому вероятность того, что именно они изменятся в про цессе разработки, выше всего. Очень часто такие требования оказывают ся также наиболее рискованными с технической точки зрения.

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

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

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

Что делать?

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

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

Для начала небольшое отклонение от темы. Если кто-нибудь спросит у меня, какой автомобиль я хочу: или минивэн, я уверен, что выберу «Феррари». Но если этот кто-то спросит у меня: «Хочешь ли ты „Феррари" за 200 000 франков или минивэн за 40 000?» — я начну фор мировать взвешенное решение. Если добавить к этому еще пару требова ний, например, «мне необходимо брать с собой в дорогу пять детей» или «я должен быть способен развить скорость 200 километров в час», карти на еще более прояснится. Существуют случаи, в которых каждое из реше ний по-своему оправданно, однако вы, скорее всего, не сможете сформи ровать хорошее решение исходя только лишь из глянцевых фотографий.

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

Следуя этой модели, бизнесмены должны определить:

• объем работ или время выпуска версий продукта;

• относительные приоритеты предполагаемых возможностей системы;

• конкретный объем работ, связанных с предполагаемыми возможно стями системы.

Для того чтобы помочь бизнесменам сформировать эти решения, раз работчики должны сообщить:

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

• Предположительные последствия использования различных техни ческих альтернатив.

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

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

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

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

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

Если заказчик говорит мне: «Мы хотим использовать вот эту реляци онную базу данных и вот эту среду Java IDE», — я должен рассказать ему о последствиях подобного решения. Если я подозреваю, что объектно-ори ентированная база данных и C++ лучшим образом подходят для данного проекта, я выполню оценку проекта с двух точек зрения. После этого биз несмены получат возможность сформировать взвешенное бизнес-решение.

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

Что если это сложно?

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

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

Когда такое происходит, вы не должны допускать каких-либо сомнений.

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

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

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

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

• собрать команду вместе;

• определить объем работ и приоритеты;

• оценить затраты и график работ;

• добиться появления у каждого заинтересованного лица ощущения того, что система действительно может быть реализована;

• определить исходные данные для обратной связи.

Давайте взглянем на принципы, которые влияют на планирование.

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

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

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

• Принимаемая ответственность — ответственность может быть толь ко принята, но не может быть назначена. Это означает, что в рам ках ХР не может быть такой вещи, как планирование сверху вниз.

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

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

• Игнорируйте взаимосвязи между частями проекта — планируйте так, как если бы части разработки можно было бы менять между собой по вашему собственному желанию. Это простое правило избавит вас от проблем при условии, что вы будете в первую очередь реализо вывать наиболее высокоприоритетные бизнес-требования. «Сколь ко стоит кофе?» «25 центов за чашку, но вторая чашка бесплатно».

«Тогда дайте мне вторую чашку». Подобные ситуации не должны происходить.

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

Игра в планирование Планирование в ХР намеренно абстрагирует процесс планирования для двух участников — бизнес (Business) и разработчики (Development). Это способствует устранению некоторого эмоционального напряжения, кото рое часто возникает в процессе обсуждения планов. Вместо «Джо, ты при дурок! Ты же обещал мне сделать это еще к минувшей пятнице!» игра в планирование (Planning Game) сообщает: «Разработчики обнаружили 116 Глава 15 • Стратегия планирования нечто. Им нужна помощь со стороны бизнеса для того, чтобы среагиро вать на открытие лучшим способом». Нельзя устранить эмоциональное напряжение при помощи простого набора правил, да мы и не собираемся этого делать. Правила существуют для того, чтобы напомнить каждому, как он должен действовать, также на правила можно сослаться в случае, если дела идут не так, как хотелось бы.

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

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

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

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

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

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

Игра в планирование Однако для начала вы должны научиться играть в соответствии с пра вилами. Вот они.

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

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

И так далее.

Куски Куски (pieces) в игре в планирование — это карточки историй (story cards).

Пример одной из них показан на рис. 6.

Рис. 6. Карточка с историей (story card) 118 Глава 15 • Стратегия планирования Игроки В игру в планирование играют два игрока — бизнес (Business) и разра ботчики (Development). Разработчики — это люди, которые отвечают за реализацию системы. Бизнес — это люди, которые принимают решения о том, что должна делать система.

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

• реальных пользователей продукта;

• заинтересованных в продукте групп;

• людей, занимающихся продажами.

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

Ходы Игра состоит из трех фаз:

• исследование (exploration) — в этой фазе необходимо определить, что нового должна делать система;

• подтверждение (commitment) — в этой фазе необходимо решить, какое подмножество всех возможных требований необходимо удов летворить в следующую очередь;

• управление (steer) — в этой фазе необходимо управлять разработ кой по мере того, как реальность вносит свои коррективы в план.

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

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

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

• Оценка истории — разработчики делают оценку времени, которое потребуется для реализации истории. Если разработчики не могут оценить историю, они просят бизнес предоставить дополнительные разъяснения либо разделить историю. Чтобы оценить историю, мож но спросить самого себя: «Какое время потребовалось бы мне для того, чтобы реализовать историю, если эта история была бы всем, что мне необходимо реализовать, и при этом меня никто не отвле кал бы и мне не надо было бы ходить на совещания?» В рамках ХР мы обозначаем данный показатель термином «идеальное время раз работки» (Ideal Engineering Time). Как будет показано позже (в раз деле «Определение скорости»), прежде чем приступить к составле нию графика работ, вы определяете коэффициент между идеальным временем и календарным.

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

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

• Сортировка в соответствии с — бизнес разделяет исто рии на три категории: (1) истории, без которых система не сможет функционировать, (2) истории, которые являются менее важными, 120 Глава 15 • Стратегия планирования но обеспечивают значительную полезность для бизнеса, (3) исто рии, которые было бы неплохо реализовать в рамках программного продукта.

• Сортировка в соответствии с риском — разработчики разделяют ис тории на три категории: истории, которые можно оценить с вы сокой степенью точности, (2) истории, которые можно оценить с приемлемой точностью, (3) истории, которые невозможно оценить.

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

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

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

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

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

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

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

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

Игра в итерационное планирование (Iteration Planning Game) очень напоминает игру в планирование (Planning Game), в которой карты ис пользуются в качестве кусков (pieces). На этот раз в качестве кусков ис пользуются не карты историй (story cards), а карты задач (task cards). Иг роками являются отдельные программисты. Шкала времени короче — вся игра укладывается в одну итерацию (от одной до четырех недель). Фазы и ходы схожи с фазами и ходами игры в планирование.

Рис. 7. Карточка задачи (task card) Фаза исследования • Написание задачи — выбор историй для итерации и преобразование их в задачи. Как правило, задача — это нечто меньшее по масштабу, чем история, так как нельзя реализовать одну историю целиком все 122 Глава 15 • Стратегия планирования го за пару дней. Иногда одна задача служит для реализации несколь ких историй. Иногда задача не связана напрямую с какой-либо исто рией — например, переход на использование новой версии системно го программного обеспечения. На рис. 7 показан пример реальной карточки задачи (task • Разделение задачи/комбинация задач — если вы не можете оценить задачу в несколько дней, разделите ее на более мелкие задачи. Если выполнение нескольких задач потребует всего несколько часов, вы можете скомбинировать их в одну большую задачу.

Фаза подтверждения • Принятие задачи — программист принимает на себя ответственность за выполнение задачи.

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

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

Для новых членов команды, равно как и для инструктора ХР, коли чество идеальных дней программирования в течение одной итера ции может быть совсем небольшим — 2 или 3 дня в течение трехне дельной итерации. Для всех остальных членов команды это значение не должно быть больше, чем 7 или 8 дней. Если для какого-то про Итерационное планирование это значение больше, это означает, что он слишком мало времени тратит на помощь своим соратникам.

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

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

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

• Отслеживание прогресса — каждые два или три дня один из членов команды спрашивает каждого из программистов, как много време ни потрачено на решение каждой из задач и сколько дней еще оста лось потратить.

• Регенерация — программисты, которые оказываются перегруженны ми, просят помощи;

для этого они: (1) уменьшают объем работ для некоторых из задач, (2) просят заказчика уменьшить объем работ для некоторых из историй, (3) отказываются от решения менее важ ных задач, (4) получают помощь со стороны соратников в большем объеме или лучшего качества, и наконец, как самый последний ва риант, (5) просят заказчика отложить реализацию некоторых исто рий до следующей итерации.

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

Различие между планированием итерации и планированием версии состоит в том, что формирование плана итерации может быть более гиб ким. Если прошла одна из трех недель итерации и процесс идет слишком медленно, возможно, имеет смысл остановиться на один день и выпол нить всеобщую совместную переработку кода для того, чтобы обеспечить дальнейший прогресс. Как правило, после нескольких таких ситуаций 124 Глава 15 • Стратегия планирования у программистов не складывается впечатление, что весь проект развалива ется на части. Однако если заказчики наблюдают подобные изменения, ко торые происходят с проектом изо дня в день, это заставляет их нервничать.

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

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

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

Давайте вернемся к ограничениям, связанным с процессом планирова ния итерации, и рассмотрим, как описанная ранее стратегия удовлетво ряет этим ограничениям.

• Вы не желаете тратить слишком много времени на планирование, так как реальность никогда не соответствует плану с точностью 100%.

Половина дня из пятнадцати — это не такая уж серьезная потеря.

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

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

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

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

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

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

126 Глава 15 • Стратегия планирования Планирование за неделю Как планировать проект, если у вас в запасе всего неделя? Подобная си туация часто возникает в случае, если команда должна сделать предло жение с фиксированной ценой. Вы получаете тендер, и у вас есть всего неделя, чтобы среагировать. У вас нет времени для того, чтобы написать полный набор историй, каждую из которых вы могли бы оценить и про тестировать. У вас нет времени на написание прототипов, поэтому вы должны оценить истории исходя из личного опыта.

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

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

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

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

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

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

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

128 Глава 16 • разработки При идеальной постоянно продолжающейся интеграции каждый раз, когда вы изменяете метод, это изменение должно немедленно отражаться во всем остальном, пусть даже не принадлежащем вам коде. Если даже не принимать во внимание инфраструктуру и скорость обмена информаци ей, которые необходимы для обеспечения работы в таком стиле, это все равно может не сработать. Когда вы разрабатываете код, вы желаете чув ствовать себя единственным программистом, работающим над проектом.

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

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

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

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

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

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

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

Коллективное владение Коллективное владение — это на первый взгляд бредовая идея, предпола гающая, что кто угодно имеет право изменять любой кусок кода в каком угодно месте системы в любое удобное для этого время. Если вы не прак тикуете автоматическое тестирование, применять коллективное владение на практике — это верный способ самоубийства. Однако с использовани ем тестирования и благодаря тому, что качество ваших тестов спустя ме сяцы практики в этом направлении будет достаточно высоким, вы може 130 Глава 16 • Стратегия разработки те смело использовать коллективное владение. Для того чтобы без опаски применять коллективное владение, необходимо также осуществлять ин теграцию каждые несколько часов работы над проектом. Именно всем этим, конечно же, вы и будете заниматься в рамках ХР.

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

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

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

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

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

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

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

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

Программирование в паре — это не объединение двух людей, которым скучно в одиночестве. Если вернуться к главе 2, можно вспомнить, что в самом начале я обращаюсь к своему соратнику за помощью. Иногда для того, чтобы решить определенную задачу, вам нужен определенный парт нер. Однако чаще вы выбираете себе партнера из тех, кто доступен. И ес ли у вас обоих есть задачи, которые необходимо выполнить, вы можете 132 Глава 16 • Стратегия разработки согласиться с утра работать над одной задачей, а после полудня работать над другой задачей.

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

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

Почему программирование парами хорошо работает в рамках ХР? Преж де всего потому, что программирование парами обеспечивает отличную ком муникацию. Мало того, программирование в парах обеспечивает более ин тенсивную коммуникацию, чем обмен сведениями между двумя людьми.

Pages:     | 1 || 3 | 4 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.