Я не могу ответить на все (на самом деле, не существует один «правильный» ответ), но вот как моя команда использует TFS - это может дать вам некоторые идеи:
Мы используем Path Area, чтобы представить проект или Epic, что работа принадлежит. Когда рабочий элемент создается, он назначается проекту с использованием пути к области, и он никогда не изменяется.
Затем для представления работы «когда» мы используем иерархический путь итерации под тремя заголовками (для проекта под названием «Проект»): Project \ Completed, Project \ Current, Project \ Future.
Истории в товарном портфеле изначально присваиваются Будущему (мы идем немного дальше и используем новые истории для представления «предлагаемой» работы, а активные - для представления «утвержденного» отставания - это позволяет нам планировать предварительные проекты/контракты, которые преобразуются в реальную работу, когда они получают зеленый свет). На этом этапе мы планируем покер, чтобы получить очки истории, а затем руководители проектов назначают ряды стека для рассказов, чтобы помочь решить, что нужно переместить из списка «Предложенный продукт», а затем, в конце концов, о чем мы должны думать для следующей итерации.
Когда мы начинаем итерацию, мы создаем новую итерацию (назовите ее 001) под Future, т. Е. Project \ Future \ 001. Затем Stories выбираются из Backlog для реализации - они назначаются для этой итерации. Когда итерация готова к запуску, мы используем подход «конвейерной ленты», который перемещает все итерации вдоль одного «места» в иерархии: в интерфейсе конфигурации Iteration Path просто перетащите итерацию 001 из будущего в текущий. Это автоматически перебирает все в этом пути, так что вся активная работа выполняется мгновенно в Project \ Current.
По завершении итерации у нас будет Current \ 001, и мы добавим Future \ 002. Затем мы перемещаем 001 и 002 вдоль конвейера (в Project \ Completed \ 001 и Project \ Current \ 002 соответственно). Таким образом, работа присваивается одной итерации и остается там, но итерация в целом переходит от будущего ... к текущему ... к завершенному. Это позволяет нам создавать запросы, такие как «вся текущая работа» (все работают под «Project \ Current»), которые нам не нужно переписывать для каждой итерации, и это экономит огромное количество времени и устраняет множество ошибок, пытающихся повторно назначать пути итерации постоянно - в большинстве случаев итерация изменяется только один раз (от будущего до фактической итерации).
Когда история переходит в текущую итерацию, мы выбираем команду-исполнителя (например, владельца, чтобы принять доставку, а также разработчика и тестера для реализации работы), и эти люди добавляют задачи для любой работы, которая должна быть выполнена чтобы донести историю. Любые ошибки/проблемы, возникающие для этой истории во время итерации, также являются родителями для Истории или Заданий.
Мы обнаружили, что инструменты TFS довольно плохие (неуклюжие, медленные, микроуправляемые), поэтому теперь мы используем домашнюю панель управления, которая показывает нам список историй, поэтому в нашей схватке мы можем пройти через рассказы и посмотреть задачи/ошибки/проблемы для каждого, кто работает над ними, и сколько работы они сообщили о задаче с момента последнего схватки. Это дает нам действительно четкую основу для обсуждения этой истории.
Мы закрываем задачи/ошибки/проблемы по мере их заполнения, но история остается открытой до конца итерации (так что любые новые обнаруженные ошибки могут быть прикреплены и обработаны). Затем мы используем настраиваемый инструмент «Разрешить» историю, которая закрывает все дочерние рабочие элементы, а затем проверяет, завершена ли родительская функция или Epic, а также может быть отмечена «Разрешена». Это также можно сделать на складе TFS только с помощью ручного процесса, но это довольно трудоемко, и код для автоматизации всего лишь час или два. Я действительно не понимаю, почему TFS заставляет вас существенно обновлять все таблицы базы данных вручную, когда их легко автоматизировать. (Подобным образом, KANB TFS не требует много времени для управления, потому что элементы появляются на нем только в том случае, если они полностью сформированы - получить какую-либо из оценочной, оставшейся, завершенной, области, итерации, назначенной, родительской ссылки и т. Д. Неправильно и он исчезает! Поэтому я написал, например, простой инструмент «создать задачу», который запрашивает оценку, правопреемника и титул, и заполняет остальные - мне потребовалось пару часов для реализации и искоренить все трудоемкие ошибки и трудность использования TFS 'raw')
При обработке задач TFS предоставляет состояния «Activity» (планирование, разработка, тестирование, документация и т. д.), что подразумевает, что каждая отдельная задача будет передаваться линейно через цепочку разных людей который будет реализован ... но мы считаем, что это плохой подход, потому что мы хотим, чтобы команда, работающая над историей, работала параллельно и работала вместе, а не «бросала свой бит» над забором к следующему парню ». Таким образом, вместо этого каждый человек в команде создает одну или несколько задач под сюжет, которые представляют собой участки работы (программирование, тестирование, документирование), которые они должны лично сделать, чтобы донести историю, и каждая задача только имеет одного владельца. (Это хорошо работает на нашей панели управления, поскольку она показывает историю и список дочерних задач/ошибок/проблем, так что весь контекст работы истории можно легко увидеть с первого взгляда). Отдельные задачи позволяют программисту и тестировщику работать вместе в тесной, итеративной, кооперативной гибкой петле, часто с прогрессивным развертыванием частей функции для тестирования, а не программистом, заканчивающим всю свою работу, прежде чем передать полную статью до тестера по водопаду. В конце итерации рассказ-команда демонстрирует свою историю более широкой команде разработчиков, и все они одинаково ответственны за обеспечение того, чтобы все необходимое было доставлено. После демонстрации владелец продукта/Чемпион принимает эту работу как выполненную (или отклоняет ее). Это значительно уменьшает количество работ, которые теряются «между трещинами», когда люди думают, что кто-то еще это сделает, помогая нам получить твердую доставку в конце. Мы обнаружили, что общение в команде и доставка сюжета значительно улучшились, так как мы перешли к этому подходу.
Следует отметить, что для получения хороших оценок и выгорания мы стараемся, чтобы каждая задача работала менее 5 дней, и чтобы избежать микроуправления, мы стараемся избегать разделения задач на что-либо менее чем за 2 дня (хотя, очевидно, некоторые задачи обязательно короче).
Как я уже упоминал, мы регистрируем ошибки/проблемы как дети задачи или истории, которые они затрагивают (а также могут добавлять связанные ссылки, если они влияют на более чем одну историю). В конце итерации, а также демонстрации новых функций остальной части команды, сборка релизов проходит регрессионную проверку в целом. Любые обнаруженные ошибки фиксируются в ветви релиза и, как мы надеемся, через день или два у нас стабильная версия клиента. Мы стремимся к тому, чтобы с каждой итерации производилось качество выпускаемых пользователями продуктов, а также количество выдающихся ошибок для разработчиков ниже 5 (обычно 1-3). Перед внедрением этой системы у нас было в среднем 20 ошибок на одного разработчика, что было неприятным техническим долгом.(Примечание: мы сохраняем некоторое время на каждой итерации для исправления этих ошибок, но когда ошибки слишком грубые, чтобы исправить тогда-и-там, мы обычно конвертируем их в новые истории, чтобы их можно было оценить и запланировать для будущей итерации, как другая работа, поэтому список ошибок и технический долг никогда не разрешается наращивать, и там, где это возможно, исправление ошибок не позволяет сорвать наш план итераций.
Мы не рассматриваем незавершенное производство (элементы на итерации) как отставание продукта - отставание продукта - это работа, которую мы планируем сделать в будущем, и когда она переходит в итерацию, она активно работает и больше не входит в список «делать» (это отставание Iteration, а не отставание продукта). Когда вся работа (задача/ошибка) будет завершена, родительский рассказ может быть разрешен («мы думаем, что это сделано»), а затем «Закрыто» («владелец продукта принимает его как« сделано ») и поэтому простой запрос (w ork в Project \ Current, который закрыт) сообщит вам, что вы поставили эту итерацию.
Наконец, когда мы завершаем итерацию, вся итерация переходит в Project \ Completed, поэтому вы можете легко запросить всю работу, которая когда-либо была завершена (в разделе Project \ Completed) и по-прежнему сгруппированы в пределах их отдельных итераций , Поэтому в любое время, если вы хотите знать, что добавляет «Build 107», вы можете просто выполнить запрос для всех закрытых историй по пути итерации Project \ Completed \ 107. Мы отмечаем неполную/оставленную работу как «Удалено», поэтому для нас «Закрытые» означает «Готово». Если работа не завершена на одной итерации и продолжена в следующем, мы просто переносим историю на следующую итерацию, и поэтому завершенная работа затем появляется в любых запросах для «Build 108», поэтому это прекрасно отслеживает достигнутые поставки для итерации.
Чтобы все было в порядке, только несколько членов команды могут изменять различные типы предметов. Поэтому наши «пункты планирования» (Epics, Features, Stories) изменяются только Менеджером проекта или владельцами продуктов. Задачи все принадлежат и, таким образом, созданы/изменены/закрыты разработчиком, который выполняет эту работу. PMs отслеживают ход рассказов и развивает отслеживание хода Задачи.
Спасибо за подробный ответ Джейсон, похоже, что вы нашли способ обойти некоторые разочаровывающие части. Я обнаружил, что рабочий элемент mgmt очень запутан и не может найти практических руководств по использованию, но тонны информации об основных возможностях. Можете ли вы рассказать о отставании продукта от отставания итерации продукта? Поскольку TFS только позволяет вам установить одно местоположение, как бы вы справлялись, скажем, добавляя новые элементы для будущей версии, а также добавляя новые элементы, предназначенные для текущей версии? – n4esa
У вас может быть определено несколько команд, каждая команда может иметь свою собственную итерацию с отставанием и свои собственные итерации спринтов. Одна вещь, которую вы можете сделать, - создать команду управления продуктом, которая имеет корневую итерацию '$/project name' в качестве своего отставания и разных выпусков (будущих и текущих) в качестве своих спринтов' $/название проекта/версия 1.0', '$/project name/release 2.0' и т. д. Их представление о отставании позволяет им перемещать работу из длинного списка вещей, которые нужно сделать для разных выпусков. Команда разработчиков устанавливает один из этих выпусков в качестве своей итерации в обратном порядке и имеет дочернюю итерацию ... – jessehouwing
Как их sprint backlog.Say Backlog iteration: '$/Project name/Release 2.0', sprints' $/Название проекта/Release 2.0/Sprint 1', '$/Название проекта/Версия 2.0/Sprint 2' и т. Д. – jessehouwing