Как Agile может применяться к приложениям, связанным со сложной обработкой?

12

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

Для этого типа приложений связь между пользовательскими историями (требованиями) и задачами разработки в основном проста: просто разделите пользовательскую историю на несколько задач.

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

  • Составители
  • Системы анализа изображений автоуправляемых автомобилей
  • Системы моделирования потока жидкости

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

Фрэнк Пуффер
источник
6
Не downvoter, но я предполагаю, что это потому, что вопрос основан на ложной предпосылке. ИМО сложные системы еще более подходит для разработки Agile стиля, в силу того факта , что они являются более сложными. Чем сложнее система, тем больше вероятность того, что у нее появятся новые требования. Agile SwDev был создан для лучшей обработки возникающих требований.
RubberDuck
4
@RubberDuck: «Я предполагаю, что это потому, что вопрос основан на ложной предпосылке.»: IMO, это будет мотивировать ответ, в котором объясняется ложная предпосылка, а не отрицательный ответ.
Джорджио
Понимает ли использование логику или нет, не имеет никакого отношения к гибкому процессу. Команда должна сопоставить пользовательскую историю с реализацией и оценить, сколько времени это займет. Если это сложно и / или много работы, команда может разделить историю на более мелкие. Тип логики не имеет значения.
Мартин Маат
2
«Большая часть литературы по agile, похоже, смещена в сторону бизнес-приложений типа CRUD» - а большая часть литературы по Java, похоже, смещена в сторону печати строки «Hello World» на консоли (или альтернативного вычисления n-го числа Фибоначчи). Это не значит, что это единственное, для чего хороша Java. Причина одинакова в обоих случаях: трудно объяснить реалистичные примеры в блоге или учебном пособии. [Примечание: это гиперболический комментарий, пытающийся проиллюстрировать основу ложной предпосылки.]
Йорг Миттаг,
1
Agile не требует задач и пользовательских историй. Вы можете использовать любую форму спецификации, которую пожелаете. Все дело в гибкости.
Фрэнк Хайлеман

Ответы:

9

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

Agile не является специфичным для приложений CRUD

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

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

Пользовательские истории! = Требования

Для этого типа приложений связь между пользовательскими историями (требованиями) и задачами разработки в основном проста: просто разделите пользовательскую историю на несколько задач.

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

ИМХО, ключевое отличие между требованиями и пользовательскими историями заключается в том, что требования подробно определяют, как должны вести себя определенные компоненты системы; это спецификации, которые включают входы, выходы, предположения / предварительные условия, возможные исключения и т. д. Они сосредоточены на том, что делает система .

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

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

пример

Я грубо вспоминаю США, в которых я работал несколько лет назад, когда пользователям нужно было самостоятельно назначать контрольные примеры, чтобы все в команде знали, над какими TC они работают, чтобы избежать дублирования усилий; пользовательский интерфейс был (n внутренним) веб-приложением. Пользователь видел только кнопку, но история была разделена на несколько задач, которые включали некоторые технические детали реализации и т. Д.

Видимость пользователя

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

Можно ли как-то сделать его видимым для пользователя?

Рассмотрим GPS. Когда вы пропустили свой ход, вы не увидите реальный процесс перерасчета маршрута, но пользователь действительно получит несколько полезных отзывов (например, «Пересчет ...»).

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

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

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

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

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

Тем не менее, требование может быть больше о системе; например:

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

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

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

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

Отношения между историями и задачами

Здесь может быть очень сложно соотносить задачи и пользовательские истории.

Наш подход состоял в том, чтобы пользовательские истории были сосредоточены на том, что было за запрос, почему он был сделан, и какие вещи должны были быть правдой, чтобы считать США «выполненными». , Как всегда осталось из США и слева разработчика (ов).

Разработчик (и) разбил бы проблему, описанную в США, на набор задач, над которыми они будут работать.

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

В зависимости от того, что мне нужно было сделать, я иногда использовал AJAX, чтобы показать простую анимацию / gif «загрузка ...», чтобы пользователь знал, что ему нужно немного подождать, чтобы завершить что-то еще, не создавая неправильного впечатления. Иногда это было так просто. Задача для этого была бы уместной.

Различная парадигма, практика и опыт

Существуют ли методы для преодоления этой проблемы, или мы просто должны принять это и извлечь из него выгоду?

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

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

Во-вторых, я думаю, вы должны согласиться с тем, что agile - это смена парадигмы по сравнению с водопадом, что означает, что, хотя процесс преследует схожие цели, они решают его по-разному. (Подумайте, SVN против Git, если это поможет.)

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

Учимся на своих спринтах - Ретроспективы

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

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

code_dredd
источник
«Истории пользователей! = Требования»: я не хотел сказать, что это синонимы. Не каждое требование - это история пользователя. Но я думаю, что все пользовательские истории - это требования. Я рассматриваю требования как иерархическую структуру, где пользовательские истории представляют собой один конкретный уровень детализации. Вы бы согласились?
Фрэнк
@FrankPuffer Я думаю, что просмотр пользовательских историй, как если бы они были разным уровнем в иерархии требований, в основном смешивает разные концепции. На Agile стороне иерархия больше похожа на: Темы >> Эпики >> Особенности >> Пользовательские истории >> Задачи . Требования обычно делятся на функциональные и нефункциональные требования в более традиционном подходе Waterfall, но я не сталкивался с реальной иерархией; Тем не менее, я не удивлюсь, если кто-то рекурсивно разделит требование на более мелкие «под» требования. В любом случае вы смешиваете разные понятия.
code_dredd
Системы управления требованиями, такие как PTC Integrity, рассматривают требования как иерархию. Это может быть преимуществом при сопоставлении требований с документом спецификации.
Фрэнк
@FrankPuffer Да, именно поэтому я сказал, что не удивлюсь. Тем не менее, мне интересно, мой ответ прояснил что-нибудь для вас. Была ли полезна аналогия SVN против Git? (Предполагается, что вы знакомы с обеими системами, что казалось разумным в контексте разработки программного обеспечения.)
code_dredd
Хорошо, я неправильно прочитал «не будет» как «будет». И да, я считаю ваш ответ очень полезным и, вероятно, приму его. Возможно, мне просто нужно время, чтобы привыкнуть к мысли не рассматривать пользовательские истории как требования.
Фрэнк
4

Agile принципы, безусловно, могут применяться в этих случаях. Как?

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

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

candied_orange
источник
Тем не менее, я думаю, что останутся одна или несколько пользовательских историй, которые требуют много так называемой базовой функциональности. Они часто не вписываются в один спринт. Как это должно быть обработано?
Фрэнк
1
Вы измеряете успешность с помощью запускаемых приложений, которые клиенты могут проверить, увидеть или потрогать. Если это так, дайте им игрушку, которая таким образом создает ощущение прогресса. Например, вы, вероятно, не можете выпустить автомобиль с самостоятельным вождением в первом спринте, но вы можете сделать демонстрацию того, как ваш альго может разведывать людей. Позже, как это разведка сигналов и животных. Позже, как Он измеряет расстояния, размеры и т. Д. Самодвижущийся автомобиль далеко, далеко в отдаленном спринте, тот, кто знает, случится ли это когда-нибудь.
Laiv
2
@Laiv: Это было бы хорошо, но я не уверен, что это работает. В частности, после первых нескольких спринтов программное обеспечение не сможет делать ничего, что может касаться клиента. У вас будет технический прогресс, но будет сложно, если не невозможно, сообщить об этом клиенту.
Фрэнк
2
Почему? Потому что он был написан на камне кем-то, чуждым вашему проекту? Я ожидаю, что Agile адаптируется под свои нужды, а не иначе. Если я скажу, что могу научить вас кататься на коньках за 4 недели, а однажды на 5-й вы все равно не выдержите, значит ли это, что вы не учитесь кататься на коньках? Или просто это займет у вас немного больше времени? Гибкий манифест не был написан на камне, и правила Скрама не являются Заповедью.
Laiv
2
Суть спринтов состоит в том, чтобы сделать вашего клиента частью ваших итераций. Для связи с ними используется доставленный код. Не планы и обещания. Это требует от вас сосредоточиться на решении проблемы. Это не требует, чтобы первое, что вы доставляете, было установлено в камне. Требуется, чтобы вы доказали, что стоите платить каждый спринт.
candied_orange
1

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

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

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

tl; dr не позволяйте scrumnazi усложнять вашу жизнь просто потому, что они слишком квадратные для адаптации. Быть адаптивным - в конце концов, ключевая концепция Agile. Строгое соблюдение Scrum или Agile обычно бросается в глаза или прагматизму и практичности (что на самом деле работает лучше всего).

evanmcdonnal
источник
Я все за гибкость, но, честно говоря, пользователь не особенно заботится о технических деталях, пока их истории удовлетворены. Вы не должны быть "строго проворными", чтобы иметь хорошие требования; Под хорошими требованиями я подразумеваю требования, каждое из которых сопровождается приемочным испытанием, которое однозначно доказывает, что требование выполнено. Люди, которые «выполняют очень глупые упражнения», очевидно, делают это неправильно, но это не значит, что они следуют некоторому понятию «строгой разборки».
Роберт Харви
@RobertHarvey Я согласен, что технические детали не имеют отношения к пользователю, но я хочу сказать, что артефакты, содержащие пользовательские истории, имеют более широкую цель, чем просто сообщение о том, как все работает для пользователя (или, по крайней мере, должно). Как обеспечить соблюдение требований, связанных с архитектурой, расширяемостью, производительностью и т. Д., Если они пишут исключительно пользовательские истории? Использование подхода «пользовательской истории» стимулирует разработчиков писать код низкого качества. И это не пользователи, читающие «пользовательские истории», это разработчики и вопросы, а глупо сознательно исключать соответствующую информацию, потому что она техническая.
evanmcdonnal
0

Я думаю, что проблема в том, чтобы придать пользовательским историям значение, которого у них нет. Scrum использует термин PBI, или Product Backlog Item, который, я думаю, гораздо лучше. PBI часто будут следовать формату истории пользователя, например, у вас может быть PBI типа «Подписчики должны иметь возможность просматривать свои данные о подписке», но вы также можете легко иметь PBI типа «Создать хранимую процедуру для получения сведений о подписчике». ».

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

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

Крис Пратт
источник
1
Я не согласен с этим, за исключением очень странных и редких случаев. В Scrum HOW это компетенция команды разработчиков, а не владельца продукта. Тем не менее, владелец продукта должен отвечать за PBI. Таким образом, PBI типа «создать хранимую процедуру» отнимает у команды разработчиков право выбирать, КАК. PBI, независимо от того, являются ли они пользовательскими или нет, должны объяснять, какова ценность бизнеса для выполнения PBI. Создание хранимой процедуры - это не бизнес-ценность, а детали реализации.
Рибальд Эдди
Не в этом дело. Это был просто пример. Вы можете просто изменить «хранимую процедуру» на нечто общее, например «путь». Дело в том, что это не обязательно должна быть история пользователя.
Крис Пратт
весь смысл примера в том, чтобы быть примером. Если ваш пример «не в этом», то в чем смысл этого примера?
Рибальд Эдди
-3

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

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

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

juhist
источник
5
На самом деле это не связано с моим вопросом, но всегда позволять человеку, обладающему лучшими навыками, реализовать функцию, может быть опасно. Это препятствует распространению знаний внутри команды. Если требуется техническое обслуживание и эксперт покинул группу или временно недоступен, у вас будут проблемы.
Фрэнк
@FrankPuffer Для некоторых из перечисленных вами систем, например, для автомобилей с автоматическим управлением, если эксперт покидает команду, у вас проблемы. Период. Хотя это, вероятно, не тот случай, когда кодирование должно быть централизованным, также совершенно необоснованно предполагать адекватное «распространение знаний», чтобы позволить замену эксперта в любой достаточно короткий промежуток времени. Это люди, которые потратили более десяти лет на изучение этой проблемы и, вероятно, находятся на вершине своей области в этой области. Возможно, вам понадобится несколько таких людей с разными наборами навыков. Такие проекты по своей сути рискованны.
Дерек Элкинс покинул SE