Agile: оценка и планирование проектов

Кон Майк

Часть VII

Анализ конкретного примера

 

 

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

В этой главе описывается вымышленная ситуация, однако в ней обобщаются многие ключевые моменты книги. В данной главе представлена выдуманная компания Bomb Shelter Studios, которая осуществляет свой первый agile-проект. В процессе повествования вы познакомитесь со следующими персонажами:

• Аллан — программист;

• Делани — аналитик;

• Карлос — agile-тренер;

• Лора — финансовый директор;

• Прасад — тестировщик;

• Роуз — художник;

• Саша — программист;

• Фил — генеральный директор;

• Фрэнк — менеджер по продукту.

 

Глава 23

Конкретный пример: Bomb Shelter Studios

 

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

Как менеджер по продукту в Bomb Shelter Studios, он знал, что их последняя игровая программа Deep Black & White демонстрировала хорошие результаты. Она позволяла играть в игру под названием го, которая была чрезвычайно популярна в Японии, Китае и Корее, но вызывала лишь умеренный интерес в Европе, Северной Америке и остальном мире. Программисты из его команды использовали решения на основе искусственного интеллекта, которые позволили Deep Black & White дойти в игре до уровня сложности, известного как пятый дан. Это, конечно, далеко от девятого дана — уровня лучших профессиональных игроков, однако значительно лучше, чем у конкурентов компании Bomb Shelter.

Фрэнк был полон энтузиазма в отношении выпуска и продажи Deep Black & White в Азии через одного издателя, с которым удалось договориться о дистрибуции во время конференции. Доход от продаж на этих рынках был бы очень кстати для Bomb Shelter. Фрэнк знал: дополнительные шесть месяцев, которые потребовались для завершения Deep Black & White, чуть было не привели к разорению небольшую частную компанию по разработке игр, соучредителем которой он являлся.

Из малоперспективной начинающей компании за три года Bomb Shelter Studios превратилась в признанного разработчика интеллектуальных и стратегических игр. В дополнение к только что законченной Deep Black & White у Bomb Shelter были программы для игры в шахматы, триктрак, реверси, бридж, шашки, манкалу и др. После создания игры права на ее дистрибуцию продавались тому или иному издателю, который занимался производством и распространением, позволяя Bomb Shelter полностью сконцентрироваться на разработке новых игр.

Пока Фрэнк был на конференции, его аналитик и небольшая команда в Санта-Барбаре обдумывали новую игру Havannah, разработку которой они были практически готовы начать. Из-за проблем с Deep Black & White — не только из-за шестимесячной задержки, но и из-за слишком большого количества ошибок и обнаруженного в последний момент неудобства использования — им нужно было срочно найти другой подход к планированию и реализации проектов. Саша, ведущий разработчик архитектуры в компании, проработала ряд выдвинутых командой идей. Она предложила в следующем проекте использовать то, что называют «agile-процесс». Фрэнк не совсем понимал, что это означает, однако у него не было сомнений в том, что им нужно подходить к делу по-другому. Шестимесячное опоздание с выпуском следующей игры было бы концом. Все члены команды горели идеей попробовать agile-процесс и знали, чтó поставлено на кон.

 

День 1 — утро понедельника

— Всем привет, — сказал Фрэнк, входя в конференц-зал. До девяти оставалась еще целая минута, однако почти вся команда была в сборе и ожидала его появления. Это был хороший знак. Несмотря на то, что команда измоталась в процессе последнего рывка с Deep Black & White, она выглядела так, словно была готова взяться за разработку Havannah.

— Привет, Фрэнк. Я видел твое электронное письмо о Deep Black & White. Сделка по дистрибуции — отличная новость, — сказал Аллан, программист C++, который разрабатывал игровой движок на искусственном интеллекте, сделавший Deep Black & White таким сильным игроком.

— Возьми пончик, Фрэнк, — предложила Саша и подвинула к нему почти пустую коробку.

— Спасибо, — ответил Фрэнк и запустил руку в коробку.

— Фрэнк, это Карлос, — сказала Саша. — Он опытный agile-тренер. Мы пригласили его, чтобы он помог нам освоить этот новый agile-подход к работе.

Фрэнк и Карлос обменялись рукопожатиями и приветствиями.

— Похоже, все в сборе, за исключением Роуз, — сказал Фрэнк. — Давайте начнем. Мы введем ее в курс дела позже. Вряд ли на этом совещании разговор пойдет о художественном оформлении.

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

— Она всегда появляется по понедельникам в пять минут десятого. Ей приходится отвозить Брук в школу по понедельникам, средам и пятницам. Она вот-вот придет, — заметил Прасад. И точно, стоило ему сказать это, как отворилась дверь и в конференц-зал вошла Роуз.

— Извините, пробки, — сказала Роуз, быстро усаживаясь в кресло.

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

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

— Правильно, но, в отличие от го, фишки не захватывают. Цель игры Havannah — построить кольцо, мост или вилку. Кто первым это сделает, тот и выигрывает.

— А что такое кольца, мосты и вилки? — спросил Фрэнк, когда Делани взяла пригоршню фишек и начала ставить их на доску.

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

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

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

— Должен ли игрок говорить до начала игры, какую фигуру он попытается построить? — поинтересовался Аллан.

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

— А что такое вилка?

— Вилка выглядит вот так, Фрэнк, — сказала Делани, добавив несколько фишек на доску, как показано на рис. 23.4. — Вилка соединяет три обреза доски, а не углы. Углы — это не обрезы, поэтому их нельзя использовать для создания вилки, они подходят только для моста.

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

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

— Но ведь тебе неинтересно возиться с какой-нибудь простенькой игровой программой, правда же, Аллан? — поддела его Саша.

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

— Не волнуйся. Из-за того, что сейчас в эту игру мало кто играет, нам не понадобится такой же мощный движок, как в Deep Black & White, — поспешила успокоить его Делани. — В конечном итоге мы доберемся и до такого же уровня, но в версии 1.0 этого пока не нужно. Вполне подойдет движок, который берет верх над людьми в большинстве случаев.

— Окей, Делани. Есть ли еще какие-то правила, о которых нам нужно знать? — спросил Фрэнк.

— Нет, это все. Правила простые, но эта игра реально заставляет поломать голову. Именно поэтому мы считаем, что она понравится клиентам, которые уже покупали наши игры.

— Так ты уже оформила документ с требованиями?

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

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

— Звучит довольно просто. А что мы будем делать с ними, когда сформулируем?

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

— Ну и как же составляются эти пользовательские истории? — спросил Фрэнк.

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

— Конечно, — ответила Делани. — Начнем вот с этого: «Как игрок я могу отменить ход с тем, чтобы исправить серьезную ошибку».

— Это наша первая история? — спросил Прасад, тестировщик.

— Да, поэтому я запишу ее на карточке, чтобы не забыть, — сказала Делани и написала карточку истории (23.1.)

— Теперь нам нужно оценить эту историю? — спросил Аллан.

— Пока нет, Аллан. Это будет легче сделать, когда у нас появится группа историй. Мы оценим их одновременно, — ответил Карлос.

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

— Хорошая история, Фрэнк. Запиши ее на карточку, — предложил Карлос менеджеру по продукту.

— А не лучше ли ввести это в электронную таблицу? — спросил Фрэнк.

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

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

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

— Чтобы записать все истории, нужно… — начал было Карлос.

— Ты и в самом деле имеешь в виду все, Карлос? — перебила agile-тренера команды Саша.

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

— Хорошо, я сделаю это, — сказал Фрэнк и написал карточку истории (23.3). — А как показать, что эта карточка связана с двумя другими? Их нужно как-то пронумеровать?

— Нет, просто разорви первые две карточки, — ответил Карлос. — Они нам больше не нужны.

Фрэнк разорвал первые две карточки.

— Карлос, Фрэнк не включил в карточку причину. Там нет «с тем, чтобы». Это нормально? — спросил Аллан.

— Эй, это всего лишь моя вторая история! — Фрэнк шутливо парировал выпад.

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

— Карлос, ты сказал, что нам нужно написать все истории сегодня, даже если некоторые из них будут сформулированы в самом общем виде. Но разве нельзя добавить истории позже? — спросила Роуз.

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

— Это здорово, Карлос. Продолжим. Может быть, мы все просто начнем писать карточки?

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

Со стороны членов команды послышались возгласы согласия, а Карлос продолжил:

— Что может пользователь захотеть сделать сразу после загрузки Havannah?

— Начать игру.

— Восстановить сохраненную партию.

— Выбрать уровень сложности.

— Ну вот, давайте запишем это, — сказал Карлос. Через несколько минут команда выдала кучу историй (табл. 23.1).

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

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

— Понятно. А что делать дальше?

— Теперь давайте подумаем, чего пользователь может захотеть во время игры.

В ответ на предложение Карлоса члены команды написали истории, представленные в табл. 23.2.

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

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

— Игрок может также захотеть вернуться и просмотреть ходы. Deep Black & White поддерживает такую возможность, — заметила Роуз. — Я могу сделать комментарий к ходу вроде такого: «Я также обдумывала возможность пойти на клетку А3».

— Окей, запишем это в виде историй, — сказал Карлос (результат представлен в табл. 23.3).

— Что дальше, Карлос? — спросил Аллан.

— Пока ты будешь шлифовать Deep Black & White в течение следующих двух недель, Делани проведет более глубокое исследование продукта.

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

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

— Конечно, давайте оценим их. Но сначала сделаем 10-минутный перерыв, — предложил Аллан.

 

Оценка пользовательских историй

— Теперь, — подвел итог совещания Карлос, — займемся оценкой размера историй в пунктах.

— А что такое пункты? — поинтересовался Фрэнк.

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

— Получается, что числа ничего не значат? — спросил Фрэнк.

— Только относительно. Два — вдвое больше одного. Восемь — вчетверо больше двух. Примерно так. Это все, что они значат, — пояснил Карлос. — Мы будем заниматься оценкой, играя в покер планирования. — Карлос раздал присутствующим по набору карт с цифрами 1, 2, 3, 5 и 8. — Теперь Делани прочтет нам одну из пользовательских историй. Мы обсудим ее и сможем задать вопросы. Затем каждый поднимет одну из розданных мною карт. Цифры на ней — это наши оценки. Все сначала выберут карты, а потом одновременно откроют их. Если цифры окажутся одинаковыми, это и будет оценка, а если нет, то мы обсудим их и историю в течение нескольких минут и повторим процесс. Процесс повторяется до тех пор, пока все не придут к одной и той же оценке.

Карлос ответил на несколько вопросов относительно метода и попросил Делани прочитать первую историю: «Как игрок я могу начать новую игру».

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

— Что ты имеешь в виду под «этой историей»? — спросил Аллан. — Пока неясно, что означает «начало новой игры».

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

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

— На мой взгляд, включает. Не думаю, что для этой истории нужно красивое игровое поле. У нас есть другая история о создании эстетически привлекательного экрана. Но эта история, несомненно, требует создания игрового поля Havannah на экране.

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

— Один, — сказал Аллан, показывая всем свою карту.

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

Цифры на картах варьировали от единицы у Аллана и Роуз до пяти у Прасада.

— Почему пять, Прасад? — спросил Карлос.

— На мой взгляд, эта история из разряда крупных, — ответил тот.

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

— Хорошо, я не смотрел на нее под таким углом, — сказал Прасад.

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

— Наша следующая история, — сказала Делани, — звучит так: «Как игрок я могу восстановить сохраненную игру».

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

— Окей, следующая история — «Как игрок я могу выбирать уровень сложности». Давайте оценим ее, — сказала Саша.

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

— Я не против, — ответила Саша.

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

— Именно это я и имел в виду, когда записывал эту историю, — вставил слово Фрэнк.

— Отлично, но тогда нам нужна такая история: «Как игрок я могу играть против компьютера на разных уровнях сложности», — сказала Роуз.

— А можно разбить эту историю? — спросил Аллан. — Я думаю, она довольно сложна. Как насчет такой: «Как игрок я могу играть против слабого компьютерного противника»? И таких: «Как игрок я могу играть против сильного компьютерного противника» и «Как игрок я могу играть против среднего компьютерного противника»?

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

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

— Теперь перейдем к истории «Как игрок я могу играть против слабого компьютерного противника», — предложил Аллан, горевший желанием обсудить истории, связанные с генератором ходов, разрабатывать который, скорее всего, придется ему. — Насколько сильно должен играть наш слабый движок?

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

— Ну так давайте оценим ее, — сказал Аллан.

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

— Хороший вопрос, — сказал Карлос. — Какие будут соображения? — Он обвел взглядом присутствующих.

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

— Звучит хорошо. А можно ли это автоматизировать? — спросила Делани. — Нам нужно автоматизировать тестирование так, чтобы, если движок начнет генерировать странные ходы, как наша Deep Black & White в апреле, мы сразу узнали об этом.

— Абсолютно согласен, — заметил Прасад. — Мы можем создать файл, который описывает позиции на доске и потом говорит, как компьютер должен реагировать.

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

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

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

— Аллан, ты ведь должен был поднять одну карту, а не все сразу. Тебе трудно принять решение?

— Нет, просто у меня не нашлось карты с достаточно большим числом, поэтому я и поднял их все. Все эти карты, — программист показал карты с цифрами 1, 2, 3, 5 и 8, — в сумме дают 19. Это, на мой взгляд, и есть правильная оценка.

— У меня есть карты и с большими числами — 13, 20, 40 и 100, — сказал Карлос и раздал всем дополнительные карты. — Я надеялся, что они не понадобятся нам, однако их тоже можно использовать.

— А почему ты надеялся, что они не понадобятся?

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

— Итак, Аллан, ты даешь этой истории 19. Уверен? — спросила Саша, глядя на восьмерку в своей руке.

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

— Ну, тебе виднее. Но 19 — слишком много, — сказала Саша.

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

— Тестирование не кажется мне сложным. Не думаю, что с ним придется много возиться. Я создам текстовые файлы для тестирования, и все.

— Конечно, но ведь мы оцениваем историю в целом, а не твою часть работы с нею. Тестирование, может быть, и тянет только на тройку, однако нужно учитывать и время, которое потребуется Аллану, — пояснил Карлос.

— Вот незадача! Тогда Аллан прав, — сказал Прасад. — Это большая история.

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

На всех картах в этот раз было 20.

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

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

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

— Без проблем. Это может сработать. Поэтому давайте разобьем нашу историю на три части по числу фигур.

Все согласились и оценили эти три истории, как показано в табл. 23.4.

— Когда это была одна история, мы ее оценивали в 20 пунктов. Теперь оценка составляет 21. Нужно ли снять один пункт с какой-нибудь истории, чтобы оценка осталась на уровне 20? — спросил Фрэнк.

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

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

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

— Так как бы ты сформулировал это в виде историй? — спросил Фрэнк.

— Я думаю, так: «Как игрок я могу играть против движка среднего уровня», — сказала Делани.

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

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

— А потом, на мой взгляд, нам нужна история «Как игрок я могу играть против движка высокого уровня», — сказал Фрэнк.

— Она как минимум в два раза больше, чем история с движком среднего уровня, — заметил Аллан. — Предыдущую историю мы оценили в восемь. Но мне бы не хотелось давать этой истории оценку 16. Может быть, достаточно 13? Это самая скромная величина. Или все же остановимся на 16?

— Представьте, — сказал Карлос, — что карточки — это ведра. Если история равна 16, то она не войдет в ведро, которое вмещает 13. Введение новых величин нам ни к чему, поскольку это приводит к излишней точности. Мы не знаем, сколько здесь в точности: 13, 16 или 19. Важно помнить, что это всего лишь оценки, а не гарантии.

— Окей, я думаю, что эта история в два-три раза больше, чем движок среднего уровня, — сказал Аллан. — Это означает диапазон от 16 до 24. Поскольку 24 не войдет в ведро, вмещающее 20, значит, мне надо дать оценку 40? Это многовато. Наша история не тянет по размеру на пять историй с движком среднего уровня.

— Нет, я бы не стал делать этого, — ответил Карлос. — Это, конечно, ведра, но представьте, что их наполняют не водой, а песком. Значит, вы можете насыпать песок горкой.

— Перейдем к оценке, — сказал Аллан.

После этого обсуждения все единодушно согласились с Алланом и подняли оценку 20.

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

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

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

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

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

— Конечно, — ответила Делани.

— Думаю, нам надо добавить историю «Как игрок я хочу, чтобы компьютер распознавал выигрышную фигуру», — заметил Аллан.

— А разве это не часть историй о генераторе ходов?

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

Возражений не последовало, и новую историю оценили в два пункта.

— Аллан, ведь тогда понизятся оценки историй для слабого движка, не так ли? — спросил Фрэнк.

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

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

— Пять — это слишком мало, — сказал Аллан.

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

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

— Теперь очередь истории «Как игроку мне хотелось бы, чтобы оформление игры на экране было эстетически приятным», — прочитала Делани.

— Ну наконец-то моя история, — сказала Роуз, художник.

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

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

— Понятно. А нельзя ли разбить это на отдельные истории? — спросила Саша.

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

— Да, вполне. Мне в любом случае пришлось бы работать над ними по отдельности.

Команда быстро оценила следующий набор историй.

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

— Что ты имеешь в виду?

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

— Ну вот, мы получили взаимозависимость: подсказку можно сделать только после реализации генератора ходов, — сказал Аллан.

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

Все согласились, и историю оценили в один пункт.

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

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

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

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

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

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

Карлос раздал всем игрокам в покер планирования карты с нулем: «Я придержал их с тем, чтобы вы не использовали ноль до тех пор, пока не зайдет разговор о том, какая история может быть нулевой». У каждого участника теперь была колода карт, содержащая 0, 1, 2, 3, 5, 8, 13, 20, 40 и 100.

— В нашем случае, впрочем, необходимо добавить поддержку подсказки после реализации генератора ходов. Так? — спросил Фрэнк.

— Да, мы оформим это как однопунктовую историю, — ответила Саша.

Обсуждение продолжалось до тех пор, пока команда не оценила все записанные истории. Эти истории с оценками приведены в табл. 23.5.

— Так что мы будем делать после этого? Нам нужна еще одна двухнедельная итерация на Deep Black & White, прежде чем мы сможем отправить ее издателю, — сказал Фрэнк.

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

— На это уйдет много времени?

— Нет, я собираюсь закончить все до завершения итерации, — добавила Делани. — Давайте соберемся опять через две недели, сразу после отгрузки Deep Black & White и после того, как Фрэнк соберет нас, чтобы отпраздновать завершение этой работы.

— Хорошая идея. Я займусь организацией этого мероприятия. Гамбургеры подойдут, Делани? Или мы замахнемся на пиццу?

Таблица 23.5. Оценки всех записанных историй

Текст истории Оценка
Как игрок я могу начать новую игру 1
Как игрок я могу восстановить сохраненную игру 2
Как игрок я могу выбирать уровень сложности 1
Как игрок я могу играть против слабого движка, распознающего только кольца 8
Как игрок я могу играть против слабого движка, распознающего только мосты 5
Как игрок я могу играть против слабого движка, распознающего только вилки 8
Как игрок я могу играть против движка среднего уровня 8
Как игрок я могу играть против движка высокого уровня 20
Как игрок я хотел бы иметь возможность использовать систему для игры с другим человеком на моем компьютере 3
Как игрок я хочу, чтобы компьютер распознавал выигрышную фигуру 2
Как игрок я хочу видеть привлекательный начальный экран при загрузке игры 5
Как игрок я хочу видеть привлекательный фон вокруг игрового поля, сочетающийся с выбранной доской 5
Как игрок я хотел бы иметь возможность выбирать между деревянной и металлической доской и фишками 8
Как игрок я хотел бы иметь возможность иногда пользоваться подсказками 1
Как новый игрок я хочу иметь возможность ознакомиться с интерактивным самоучителем по игре 8
Как игрок я хочу, чтобы в игре был музыкальный фон 5
Как игрок я могу выбирать музыкальный фон игры 1
Как игрок я хочу ставить фишку на доску с помощью клавиатуры или мыши 3
Как игрок я хочу видеть визуальный индикатор очередности хода 2
Как игрок я хотел бы видеть визуальный индикатор последней поставленной фишки (возможно, сделать ее мигающей) 2
Как игрок я хотел бы иметь возможность отменять и повторять ходы 2
Как игрок я хотел бы иметь возможность сохранять партии 3
Как игрок я хочу иметь возможность закончить игру 1
Как игрок я хочу возобновлять игру так, чтобы можно было отказаться от текущей игры и начать новую 1
Как новый игрок я хочу иметь доступ к онлайновой справочной системе 8
Как игрок я хочу, чтобы все фишки выигрышной фигуры мигали или подсвечивались с тем, чтобы можно было видеть выигрышную фигуру 3
Как новый игрок я хотел бы получать предупреждение о неудачном ходе и иметь возможность отменять его 8
Как новый игрок я хотел бы, когда наступает моя очередь делать ход, видеть клетку, на которую нужно поставить фишку, чтобы ее не занял компьютер и не обыграл меня 3
Как игрок я хотел бы, чтобы компьютеру требовалось на ход не более двух секунд на 2,0 ГГц PC 8
Как игрок я хочу, чтобы система отслеживала, сколько партий я выиграл, а сколько проиграл (в зависимости от уровня сложности?) 3
Как игрок я хотел бы добавлять комментарии к сохраненным партиям 3
Как игрок я хотел бы просматривать ходы с тем, чтобы иметь возможность анализировать сыгранные партии 5

 

Подготовка к исследованию продукта

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

— Здравствуй, Делани, — поприветствовал Фрэнк аналитика. — У тебя найдется для меня минутка в это чудесное утро?

— Конечно. Я пришла пораньше, чтобы доработать анкету, которую собираюсь разослать. Посмотри, что получилось.

— Давай посмотрим, — сказал Фрэнк, усаживаясь в кресло. — Покажи, что у тебя получилось.

— Я напечатала это полчаса назад, — сказала Делани и протянула Фрэнку страницу с текстом (табл. 23.6). После этого я добавила еще кое-что, но это все равно дает представление о том, что я собираюсь разослать.

Фрэнк просмотрел страницу, которую дала ему Делани, и спросил: «Ты задаешь каждый вопрос дважды. Зачем?»

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

— Можешь ли ты привести пример, показывающий, насколько это может быть важным?

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

— Окей, согласен.

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

— Но разве это нельзя выяснить, попросив пользователей оценить важность функций по шкале от одного до пяти, как мы сделали в случае Deep Black & White? — спросил Фрэнк.

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

— Кому ты собираешься давать эту анкету?

— Я собираюсь разослать ее примерно 500 членам ряда игровых клубов, в которых, насколько мне известно, играют в Havannah. Многие из них находятся в Европе и в крупных американских городах. Тем, кто ответит, мы предлагаем купон на скидку в размере $10 при покупке наших существующих игр. Я рассчитываю получить порядка полусотни ответов. А еще я собираюсь провести небольшой телефонный опрос.

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

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

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

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

Прежде чем Фрэнк успел ответить, к нему с Делани подкатил на своем кресле Аллан.

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

— Конечно, Аллан.

— Чудесно. Знаешь, мне было бы интересно послушать парочку твоих телефонных интервью, хочу знать, что говорят пользователи. Это осуществимо? — спросил Аллан.

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

— Идет, — сказал Аллан. — Сегодня я не могу сидеть на телефоне, мне нужно устранить ошибки в системе подсчета очков в Deep Black & White. Но в остальные дни этой недели дай мне знать, когда соберешься обзванивать пользователей.

— Непременно, — ответила Делани.

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

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

— Чудесно. Спасибо тебе за информацию, — сказал Фрэнк и откланялся.

 

Планирование итерации и релиза, раунд 1

 

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

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

Саша выждала несколько секунд, чтобы понять, есть ли вопросы. Вопросов не было.

 

Планирование первой итерации

— Так с чего мы начнем разработку? — спросила Роуз.

— Я хочу начать с генератора ходов, — сказал Аллан. — Это наш самый большой источник риска.

— У меня возражений нет, — заметила Саша, другой программист команды. — Чем я могу помочь, Аллан? Обычно все, что касается искусственного интеллекта, твоя доля работы.

— Да, но кое-что можешь сделать ты. Спасибо, — ответил Аллан. — Твоя помощь очень кстати, поскольку меня беспокоит сложность разработки сильного движка.

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

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

— Окей. Сколько времени, на твой взгляд, это займет? Пару дней?

— Пару полных дней. Лучше сказать, 16 часов, — ответил Аллан.

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

Аллан заполнил карточку задачи (23.1).

— Может быть, поставить на ней мои инициалы, чтобы не забыть, чья это карточка?

— Нет. Иначе будет казаться, что этим занимаешься ты один. Лучше, если мы на текущем этапе не будем распределять работу между исполнителями.

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

Он заполнил карточку задачи 23.2.

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

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

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

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

— Пожалуй, на это у меня уйдет львиная доля дня. Поставь, пожалуйста, на карточке шесть часов, — попросил Аллан.

— Аллан, без обид, ты всегда чересчур оптимистичен перед началом разработки нового генератора ходов, — заметила Роуз, художник.

— Да, есть такое. Давайте лучше удвоим оценку, — согласился Аллан.

Саша зачеркнула «шесть» на карточке и поставила 12.

Карлос руководил обсуждением оценок остальных задач, идентифицированных Алланом. «Есть ли еще неидентифицированные задачи для этой истории?» — спросил он.

— Не забывайте, что нужно еще время на тестирование! — сказал Прасад. — Если Аллан будет давать мне код после выполнения каждой из идентифицированных им задач, то я смогу определять и автоматизировать тесты одновременно с ним. О выявленных ошибках он будет узнавать, пока информация о коде еще не выветрилась у него из головы. Я написал задачи на карточках, пока Аллан рассказывал, как он будет работать, но они еще не оценены. Может быть, сделаем это вместе?

Когда члены команды закончили обсуждение истории «Как игрок я могу играть против слабого движка, распознающего только кольца», они представили карточки задач с оценками (табл. 23.7).

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

— Шесть, на мой взгляд, нормально.

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

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

— Историю или задачи? — спросил Фрэнк. — В отношении чего мы должны взять обязательство?

— Хороший вопрос, Фрэнк, — заметил Карлос. — Вы берете обязательство в отношении истории. Задачи идентифицировались как способ определить, какой объем работы предстоит сделать, и помочь взять обязательство. Поскольку обязательство берется в отношении истории, а не задач, важно, чтобы вы думали о нем как об обязательстве всей команды. Я не хочу, чтобы в конце итерации Саша сказала, что она сделала свою часть работы, связанной с классами управления состоянием, а Аллан нет. Это не приводит ни к чему хорошему. Вы можете думать о задачах, но обязательства принимаете в отношении историй.

— Любопытно, — сказал Фрэнк. — Мне нравится различие.

— Я могу взять обязательство в отношении этой истории, — заявил Прасад. — У меня задачи тестирования объемом 36 часов. При шести часах в день в течение 10 дней я располагаю 60 часами.

— А у нас с Алланом объем задач 48 часов. Это не будет проблемой, — сказала Саша.

— Отлично. Мы спланировали первую историю и взяли обязательство реализовать ее, — сказал Фрэнк. — На очереди вторая по важности история.

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

— Я беру два выходных дня. Я отправила пару картин на выставку в Сан-Франциско и хочу посмотреть, как там идут дела, — сказала Роуз.

— Пожалуй, и я возьму выходной. В пятницу или в понедельник, — вставил слово Аллан.

— А ко мне на следующей неделе приезжают родители. Слишком длительное общение с ними сведет меня с ума, поэтому я буду работать сверхурочно! — пошутила Делани.

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

— Спасибо, Карлос, — сказал Фрэнк. — Что теперь на очереди?

— Мне очень хочется получить возможность игры человека с человеком, — сказала Делани.

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

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

Все согласились. Полученный в результате обсуждения перечень задач представлен в табл. 23.9.

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

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

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

— Да, — почти в один голос сказали Аллан и Саша.

— На мой взгляд, тоже, — высказалась Роуз.

— Не уверен, — возразил Прасад.

— Поясни свой вывод, Прасад, — попросил Карлос тестировщика.

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

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

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

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

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

— Можем ли мы взять обязательство по реализации и этой истории? — спросила Роуз.

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

— Пока мы разговаривали, я добавила вот это, — сказала Саша, поднимаясь с кресла. — Смотрите, что получилось. Она нарисовала табл. 23.11.

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

— У нас два программиста, и у каждого есть 30 часов в неделю и двухнедельная итерация; я думаю, с нашей стороны все окей, — сказала Саша.

— Согласен, — поддержал ее Аллан.

— Впрочем, брать на себя что-то дополнительно к этому очень не хотелось бы, — добавила Саша. — А кроме того, объем тестирования слишком велик для одного Прасада.

— Я собираюсь помочь ему, — сказала Роуз.

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

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

— Итак, все согласны? — спросил Фрэнк.

Возражений не последовало.

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

— На мой взгляд, это логично, — сказал Фрэнк. — Давайте добавим эти задачи.

— Итак, если суммировать все перечисленное, готовы ли мы принять обязательство по реализации этого? — спросила Саша. — Теперь в итоге получается 224 часа. В проекте участвуют пять человек — Аллан, Прасад, Роуз, Делани и я — это около пяти часов в день на человека. Но это лишь в том случае, если бы все работы и мы были взаимозаменяемыми. К сожалению, это не так.

— А кроме того, — добавил Карлос, — лучше добавить что-нибудь в середине итерации, чем выбросить что-то за недостатком времени.

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

— Фантастика! — сказал Фрэнк. — Чудесно сознавать, что мы достигнем видимого прогресса так быстро. Обычно требуется намного больше времени, чтобы получить что-нибудь пригодное для показа.

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

 

Планирование релиза

Когда все вернулись и расселись за столом, Фрэнк начал совещание:

— Делани, расскажи нам об исследовании продукта и о его результатах.

— Вот что я сделала, — сказала Делани. — Я разослала порядка 500 предложений заполнить веб-анкету. Кроме того, опросила по телефону 35 вероятных покупателей игры, подобной нашей. В итоге мы получили ответы от 75 потенциальных покупателей. Цель опроса заключалась в выяснении, какие из идентифицированных нами функций являются обязательными, т. е. такими, которые обязательно должны присутствовать в игре. Мы также хотели узнать, какие функции являются привлекательными. Они необязательно должны иметься в игре, но их включение делает игру более привлекательной и позволяет повысить ее цену. Наконец, существуют такие функции, которые мы называем линейными. Чем больше линейных функций присутствует в продукте, тем больше люди платят за него. Примером линейных функций является мощность двигателя автомобиля, количество каналов спутникового телевидения и количество уровней сложности в игре. Не буду подробно рассказывать о том, как я проводила исследование. Но если вам интересно, могу назвать нужную главу в книге (см. главу 11 «Приоритизация желательности»). Результаты исследования я обобщила здесь. — Делани раздала присутствовавшим распечатку табл. 23.12.

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

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

— Я могу связать первые три колонки с твоим описанием трех типов функций, Делани. Но что означают категории «Безразличная», «Обратная» и «Сомнительная»? — спросила Роуз.

— Хороший вопрос. Безразличная означает, что у человека нет никаких заметных предпочтений в отношении функции, — объяснила Делани. — Форма представления вопросов позволяет нам не учитывать случайное мнение. Это, например, может произойти, когда кто-то говорит, что ему не нравится фоновая музыка, но ему также не по вкусу ее отсутствие. Такое случается. Люди, бывает, путают или неправильно понимают вопросы в спешке. Обратите внимание, что доля обратных и сомнительных функций довольно невелика.

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

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

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

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

— Правильно, это было бы очень полезно, — сказал Фрэнк. — У кого-нибудь есть еще вопросы к Делани? — Фрэнк выдержал паузу, прежде чем продолжить: — Если нет, то давайте перейдем к обсуждению того, что нужно включить в релиз Havannah.

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

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

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

Делани взяла еще одну группу карточек.

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

— Делани, а почему ты включаешь сильный движок сюда? — спросил Аллан. — Мне это нравится, но в соответствии с тем, что ты нам показывала несколько минут назад, эта функция считается одновременно и обязательной, и безразличной.

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

— Окей.

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

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

Делани разложила истории на столе так, как показано в табл. 23.15.

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

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

— Это понятно, — сказал Фрэнк. — Но у тебя есть еще какие-то карточки. Что за истории на них?

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

— После привлекательных функций, — продолжила Делани, — у нас остаются две истории, к которым потенциальные игроки безразличны. Я не думаю, что нам нужно включать их в релиз. — Она выложила на стол карточки (табл. 23.17). — Нам вряд ли удастся продать больше или продавать по более высокой цене в результате добавления функций, к которым игроки безразличны.

— Здорово! — сказал Фрэнк. — Это больше информации, чем у нас обычно бывает на данном этапе. Отличная работа, Делани. Все это получено в результате опроса?

— Да. Анкета специально была сделана несложной, в ней пользователей просто спрашивали о том, как они относятся к наличию той или иной функции и к ее отсутствию. Из-за того, что я объединила некоторые наши пользовательские истории в темы, в анкету вошли всего лишь 24 вопроса. При разговоре по телефону с учетом вступительной болтовни на нее уходило минут 15. Наш веб-сайт отслеживал время, затрачиваемое на заполнение формы. В среднем оно занимало семь минут. Одному посетителю потребовалось 40 минут, но я подозреваю, что он просто уходил или разговаривал с кем-то по телефону.

— Итак, Фрэнк, как ты расставишь приоритеты? — спросила Саша.

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

— По нашим оценкам, их суммарный размер составляет 88 пунктов, — сказала Саша.

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

— Таким образом, ты хочешь получить все линейные функции. Это еще 32 пункта, — сказала Саша.

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

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

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

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

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

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

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

— Это 12 пунктов из списка привлекательных функций. Будем ли включать что-то из категории безразличных функций? — спросила Саша.

— Не думаю, — ответил Фрэнк. — Что у нас получается в сумме?

— Ты выбрал 88 пунктов из категории обязательных функций, 32 пункта из категории линейных и 12 из категории привлекательных. Всего получилось 132 пункта, — сказала Саша.

— И вы реализуете это за две итерации, так? — спросил Фрэнк с улыбкой.

— Если сможем, то да.

— А если серьезно, то как определить, сколько времени на это потребуется?

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

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

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

— И такая оценка будет довольно точной? — спросил Фрэнк.

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

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

— Но можно хоть как-то оценить сроки прямо сейчас?

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

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

— Сколько итераций потребует реализация проекта при скорости 18?

— Чуть больше семи итераций. У нас 132 пункта. Семь на 18 — это 126. Итого шесть пунктов сверх семи итераций, — сказал Прасад.

— Можем ли мы сказать, что нам нужно семь итераций? — спросил Фрэнк.

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

— Мне как-то не хочется, чтобы этот проект растягивался на 20 недель. Но ты говоришь, что он может занять и 12 недель, так ведь? — спросил Фрэнк.

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

— Ну хорошо, я смогу объяснить руководству разброс от 12 до 20 недель, — сказал Фрэнк. — Давайте теперь займемся нашим начальным планом.

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

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

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

— Так нам нужен план того, над чем мы будем работать в каждой итерации? — спросил Фрэнк.

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

— Я понимаю, зачем нужно знать главные приоритеты, но зачем нам функции из нижней части списка? — заметил Фрэнк.

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

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

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

— Так мы закончили с планированием релиза? — спросил Фрэнк.

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

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

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

— Абсолютно. Будет чудесно увидеть все это через две недели.

 

Две недели спустя

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

— К сожалению, нам пришлось отказаться от истории «Как игрок я хочу, чтобы компьютер распознавал выигрышную фигуру», но ты мне здорово помогла, Саша. Спасибо, — благодарил ее Аллан.

— Не стоит, Аллан. Все жалеют об этом, но продемонстрировать движок, который умеет выстраивать кольца и мосты, было важнее, — ответила Саша.

— Все готовы к представлению демоверсии? — спросил Фрэнк, который вошел в зал точно в 9:00. Он поставил на стол коробку с булочками.

— Конечно, — ответила Саша. — На анализе результатов итерации будет присутствовать кто-нибудь из руководства?

— Обещали быть Фил и Лора, — сказал Фрэнк.

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

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

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

— Это фантастика, — заявил Фил, поднимаясь с кресла. — Так вы будете показывать что-то новое каждые две недели?

— Да. Каждые две недели здесь в 9:00, — ответила Саша.

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

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

— Отлично, — сказал Фил.

Он и Лора вышли из конференц-зала. За ними последовали еще человек пять, которые приходили познакомиться с проектом.

 

Планирование второй итерации

— Если я не ошибаюсь, — сказал Фрэнк, — наша плановая скорость составляла 18 пунктов.

— Именно столько, — ответила Делани.

Однако нам не удалось завершить историю о распознавании выигрышной фигуры, поэтому наша скорость оказалась меньше 18. Можем ли мы дать себе один пункт за выполнение половины этой истории? — спросил Фрэнк.

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

— Поэтому наша скорость составила 16 с учетом того, что мы оценили незаконченную историю в два пункта, — сказала Роуз.

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

— Мы все еще не вышли из диапазона 12–20 недель, который представили руководству, — сказала Саша. — Мы начали, имея 132 пункта, выполнили 16, значит, у нас осталось 116 пунктов. Делим 116 на 16 и получаем 7,25. Для страховки скажем, что это скорее восемь двухнедельных итераций. С учетом прошедших двух недель в сумме получается 18 недель.

— Это на две недели больше, чем четыре месяца, Фрэнк. Это существенно? — спросил Прасад.

— Нет, на самом деле. Релиз не привязан к конкретной дате. Мы просто хотим сделать его как можно быстрее, — ответил Фрэнк. — Да, должен вам сказать, мы не закрыли договор на Deep Black & White с японским издателем. Они все еще хотят издавать игру. До подписания окончательного договора осталось совсем немного. Однако они не хотят начинать продажу игры, пока не запустят серьезную маркетинговую программу с рекламой во всех крупнейших журналах. На это может уйти четыре месяца. Деньги же мы начнем получать только через квартал после начала продаж. Таким образом, прежде чем Deep Black & White принесет нам какие-нибудь деньги, может пройти восемь месяцев. Было бы хорошо, если бы Havannah дала быструю отдачу. Пусть даже не в таком масштабе, как Deep Black & White. Но из-за того, что она не требует предварительной рекламной раскрутки, выручка от нее может поступить быстрее.

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

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

— Итак, Фрэнк, что бы ты хотел видеть реализованным в следующей итерации?

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

— Но, если наша скорость в прошлой итерации была равна 16, почему мы в этот раз включаем в план 18 пунктов? — спросил Фрэнк.

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

— Почему?

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

— Убедили, — сказал Фрэнк. — Давайте так и сделаем.

 

Две недели спустя

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

— Игра начинает приобретать очертания. Не могу поверить, что ваш генератор ходов уже может обыграть меня, — сказал Фил. — Роуз, эти первые две доски выглядят фантастически. Сроки у нас все еще прежние? Через 8–16 недель с текущего момента?

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

— Мне нравится то, что ты сказал насчет увеличения выручки, — сказала Лора, финансовый директор.

— Мне тоже, — поддержал ее Фил. — Но я не в восторге от возможного переноса сроков.

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

— Я всегда за более ценные игры. Сообщите мне о своем решении, — сказал Фил, покидая конференц-зал. Вслед за ним вышли и остальные гости. В зале осталась только проектная команда.

 

Пересмотр плана релиза

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

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

— Это первая новая функция, — продолжила Делани. — Вторая — это онлайновая игра. Люди хотят играть друг с другом в сети.

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

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

— Характеры. Хорошие характеры должны стать действенно очень привлекательными. Это функция, которая реально понравится людям, но которую они совершенно не ожидают, — ответила Делани.

— Делани, ты только что сообщила, что объем работ поползет. Но мы ведь и так уже у верхнего края нашего 12–20-недельного диапазона, — заметил Прасад. — Почему же ты говоришь, что это «хорошая новость»? У тебя есть еще что-то для нас?

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

— Давайте займемся этим, — сказал Фрэнк. — Я полностью готов изменить сроки проекта, если мы сможем больше заработать. И это не такая уж большая отсрочка. Эти функции выглядят очень заманчиво.

— Но, Делани, почему анкета, которую ты рассылала, не позволила идентифицировать эти функции? — спросил Прасад.

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

— Мне нравится эта мысль, — сказал Аллан. — Если игра принесет больше денег, возможно, Фрэнк пригласит нас в какое-нибудь более дорогое местечко, чем Fatburger, чтобы отпраздновать выпуск релиза.

— Мне понравились бургеры, когда мы отмечали выпуск Deep Black & White, — сказал Прасад.

— А мне нет. После нынешнего релиза, я думаю, Фрэнк раскошелится на суши, — заметила Роуз.

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

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

— В первых двух итерациях мы реализовали 16 и 18 пунктов. Теперь мы добавили 35 пунктов и, таким образом, вернулись туда, где были! — пошутил Аллан.

— Ты прав, Аллан, — сказал Карлос, доставая калькулятор. — Мы получили 133 пункта. При текущей средней скорости 17 пунктов на итерацию нам нужно 7,8 итераций.

— Восемь итераций плюс две, которые мы уже выполнили, итого 10 итераций, — сказал Фрэнк.

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

— Не хочешь ли ты сказать, что нам нужно изменить сроки? — спросил Фрэнк.

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

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

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

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

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

— А если мы уложимся в график и решим отказаться от реализации этих историй, то сможем выпустить релиз как минимум на одну итерацию раньше, так? Когда мы должны выпустить релиз, если откажемся от этих историй? — спросил Фрэнк.

— У нас включено в план 133 пункта. Вы готовы выбросить 22 пункта. Остается 111 пунктов, — сказал Карлос, отрываясь от калькулятора. — При скорости 17 вам нужно еще семь итераций. Это означает, что проект можно завершить за 18, а не за 20 недель.

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

Сопровождать Фрэнка вызвались Делани и Аллан. В случае Делани удивляться здесь нечему — как аналитик, она часто участвовала в принятии решений по продукту и срокам. А вот интерес Аллана удивил Фрэнка. Обычно Аллана, одного из самых консервативных технарей в Bomb Shelter, совершенно не трогали споры в сфере бизнеса. Однако с начала этого проекта четыре недели назад он по-настоящему стал участвовать в них. Фрэнк оценил перемены. Это позволяло принимать более качественные решения по продукту.

— Я иду прямо сейчас, — сказал Фрэнк. — Давайте покажем, что получилось.

— Может, лучше сначала подготовить демонстрационные материалы для Фила? — спросил Аллан.

— Лишнее. У него есть магнитно-маркерная доска. Мы нарисуем все на ней.

 

Презентация пересмотренного плана у Фила

— Привет, Фил. Ты по-прежнему хочешь узнать, что мы решили по этим новым функциям в Havannah? — спросил Фрэнк.

— Конечно. Это те функции, о которых Делани говорила утром?

— Да.

— У меня есть примерно 15 минут. Хватит?

— С лихвой, — сказал Фрэнк. Затем он попросил Делани объяснить, как ее исследование привело к появлению новых идей по онлайновой игре и характерам.

— Фил, помнишь, как я несколько недель назад рассказывала об оценках историй в пунктах?

— Конечно.

— И о том, что пункты — это показатель размера. Мы начали со 132 пунктов. В первой итерации было реализовано 16 пунктов, во второй — 18. Аллан, можешь изобразить это в виде графика? — попросил Фрэнк, указывая на свободное место на доске Фила. Аллан подошел к доске и начертил то, что изображено на рис. 23.5. — То, что ты здесь видишь, — продолжил Фрэнк, — мы называем диаграммой выгорания релиза. Глядя на нее, ты можешь видеть наш темп прогресса. После двух итераций мы реализовали 34 пункта. Если продолжить линию, то ты увидишь, что мы завершаем работу на восьмой итерации. Это в сумме 16 недель.

Пока Фрэнк говорил, Аллан продлил линию, как показано на рис. 23.6.

— Команда Havannah сошлась на том, что добавление характеров, идентифицированное Делани, это хорошая идея.

— Сколько времени это займет? — спросил Фил.

— Мы считаем, что нам нужно пять характеров. Всего это 35 пунктов, — ответил Фрэнк.

— Это означает, что наше выгорание фактически возвращается сюда, — сказал Аллан. Он провел вертикальную линию вверх до уровня 133 пункта, как показано на рис. 23.7.

— М-м-м… Выглядит не очень хорошо. После двух итераций вы на том же месте, откуда начинали.

— В действительности наше положение намного лучше. За четыре недели мы заметно продвинулись вперед, — сказал Аллан, указывая на линию на диаграмме. — Мы устранили некоторые из наиболее рискованных частей проекта, было показано, как идет разработка генератора ходов. Хотя был сделан только слабый движок, я понял, как нужно подходить к созданию сильного движка. Мы многому научились. Мы нашли новую функцию, которую Делани определила как привлекательную для целевой аудитории. Обычно это выясняется намного позже. Если смотреть на то, где мы находимся, то действительно кажется, что у нас столько же работы, сколько было четыре недели назад, но сейчас я намного больше уверен в плане, чем тогда. И каждый раз, когда мы добавляем новую точку на этой диаграмме выгорания, моя уверенность крепнет, хотя далеко не все новости хорошие. Главная новость в том, что я могу быть уверенным в нашем прогрессе. — Аллан остановился. — Нет, наше положение намного лучше, чем четыре недели назад.

— Так сколько займет проект, если мы добавим характеры? — спросил Фил. К приятному удивлению Фрэнка, этот вопрос был адресован Аллану.

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

— И игра будет продаваться лучше или по более высокой цене? — спросил Фил.

— Да, я уверен в этом, — сказал Фрэнк. — Я хочу провести еще несколько исследований и построить модель, чтобы решить, следует ли нам продавать по текущей цене или можно увеличить ее на $5.

— Вы меня убедили. Спасибо за презентацию, — сказал Фил.

Аллан начал стирать нарисованную диаграмму.

— Не надо. Пусть останется, — сказал Фил. — Я хочу обновлять ее каждые две недели.

— Спасибо, что уделил нам время, Фил, — сказал Фрэнк, когда они с Делани и Алланом покидали кабинет.

 

Восемнадцать недель спустя

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

— Допускаю, что получилась отличная игра, но мне не нравится ощущение запаздывания. Первоначально мы думали, что ее можно сделать всего за 14 недель, но всем говорили, что за 12–20 недель. А в результате мы сдали работу еще на две недели позже, — сказал Прасад.

— Да, мы сделали ее за 22 недели, — сказала Саша. — Но мы и не говорили, что сдадим ее через 14 недель. После планирования первой итерации мы утверждали, что нам требуется от 12 до 20 недель, а более точная оценка появится только через шесть недель.

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

— А еще не забывайте, что Deep Black & White вышла позже на полгода, а не на две недели.

— Так что, Фрэнк, ты опять будешь угощать нас бургерами в честь этого релиза?

— Нет, на этот раз я куплю вам все, что вы пожелаете.