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

We use cookies. Read the Privacy and Cookie Policy

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

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

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

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

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

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

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

— Пару полных дней. Лучше сказать, 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-минутный перерыв, — предложил Карлос. — Когда мы вернемся, я хочу перейти ко второму вопросу нашего совещания: планированию релиза. Нам нужно сделать первоначальные прикидки, сколько времени займет проект.