Есть ли какие-то преимущества в гибких методах, помимо работающей сборки между спринтами?

9

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

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

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

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

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

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

tux91
источник
У вас есть пункт. Я хотел бы отметить, что термин «водопад» не имеет 1 универсального определения (как и многие другие термины в ИТ). Большинство людей думают, что вам не разрешено кодировать, если не написаны и подписаны все 2000 страниц требований. Это не должно иметь место вообще.
NoChance
Да, под «водопадом» я подразумеваю линейный процесс (в основном) функциональных спецификаций -> дизайн -> кода между этапами, а не спринтами. И, конечно же, требования к 2000 страницам и технические спецификации не обязательны, базовые обязанности классов и их отношения друг к другу часто достаточны как дизайн верхнего уровня.
tux91
3
@ EmmadKareem: На самом деле, в самом Водопаде, это именно так. Вы не начнете кодировать, пока каждая деталь дизайна не станет окончательной. К счастью, настоящий Waterfall редко применяется в разработке программного обеспечения - в основном потому, что он на самом деле не работает.
tdammers
1
@tdammers, спасибо за ваш комментарий. Это случилось несколько раз, хотя. Метод водопада не имеет владельца и может применяться и интерпретироваться по-разному. У тебя нет правила, которое гласит: не кодируй, пока .... или иначе ... это потому, что это не методология. Если использовать хорошую методологию, я думаю, что это имеет смысл, особенно в проектах, где пользователи знают, что им нужно от системы.
NoChance
@ Эммад Карим: Я согласен с вами. Я думаю, что гибкие методы больше подходят для проектов, в которых требования не ясны, и для получения окончательных требований требуется много прототипов и отзывов пользователей. С другой стороны, есть случаи, когда основные требования ясны с самого начала. В этих случаях я бы применил метод разработки, который больше похож на водопад (с некоторыми возможностями для исправления на этом пути), чем на гибкий метод. Я думаю, что это действительно зависит от того, над каким проектом вы работаете.
Джорджио

Ответы:

7

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

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

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

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

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

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

Мэтью Флинн
источник
Большое спасибо. Для всех, кто хочет прочитать статью о том, как дизайн работает в Agile и почему все не так плохо: http://jamesshore.com/Agile-Book/incremental_design.html
tux91
8

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

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

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

Горт Робот
источник
Первый аргумент, это именно то, для чего у меня сложилось впечатление, что Agile. Работа с постоянно меняющимися требованиями. Кроме того, что касается раннего изменения требований, у этого все еще есть огромная возможность возиться с имеющейся архитектурой, что приводит к повторной реализации большого количества существующего кода. Второй аргумент, не могли бы вы пояснить, почему проекты водопадов вызывают марши смерти? Кажется, что небольшая дисциплина в сочетании с краткими техническими характеристиками может творить чудеса здесь. Третий аргумент: в чем проблема с построением проекта водопада снизу вверх и возможностью его создания время от времени?
tux91
2
Мой опыт работы с проектами Waterfall заключается в том, что они всегда вовремя в течение первых 90% запланированного времени, после чего они неожиданно отстают на несколько месяцев. Agile модель настаивания на демонстрациях каждого спринта делает это намного менее вероятным. Когда люди знают, что они будут нести ответственность через полторы недели, они обычно более мотивированы, чем когда они будут нести ответственность через девять месяцев. Это просто человеческая психология.
Gort the Robot
1
Ну, я думаю, что не могу спорить с опытом, хотя мой опыт был немного другим, с хорошим дизайном в ручном кодировании не было много проблем на этом пути, и оценки, казалось, тоже были довольно хорошими. Я все еще думаю, что получающаяся архитектура будет более надежной, если использовать водопад.
tux91
2
Есть несколько областей - в основном безопасности критически важных из них, например, железнодорожной сигнализации, авионики - где клиенты делают очень внимательно прочитать спецификации. Они довольно редки и, в любом случае, ведут к совершенно разным методологиям разработки.
Donal Fellows
4

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

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

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

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

То же самое с YouTube, Twitter и множеством других компаний.

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

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


источник
3
Используя слово «никогда», вы говорите, что нет никаких программных продуктов, которые были бы сделаны с использованием водопада? Кроме того, почему «никогда» не выпускать что-либо, если у вас есть набор требований для определенного этапа, который вы успешно реализовали?
tux91
1
@ tux91 вы делаете мою точку зрения для меня; ничто не может быть идеальным, если учесть, что он должен измениться сразу после того, как дизайны представлены на бумаге и устарели до написания одной строки кода. Таким образом, утверждение, которое я привел, является заблуждением: вы никогда не будете совершенствовать архитектуру и, следовательно, никогда ничего не выпускаете.
1
@ tux91 все еще читают для понимания, я сказал, что нет префектной архитектуры, и если вы не выпустите, пока не будет, как в цитате, то ничего не будет выпущено. Я не сказал, на что вы претендуете, точка, это в вашей голове и в вашей интерпретации. То, что я сказал, является аргументом, что водопад так или иначе обеспечивает лучшее качество архитектуры, является ошибкой и в корне ошибочной. И эти аргументы о НАСА и водопаде, а что нет; кроме того, что он не имел отношения к программистам , он убил 3 астронавтов на земле, что не является блестящей историей успеха.
1
@ tux91 по поводу использования «никогда», я здесь с Джарродом: вопрос говорит: «водопад позволяет вам совершенствовать ...», - противостоит он совершенно подходящим (в этом нереалистичном «идеальном» контексте) слову «никогда». Единственная причина, по которой я не высказался, состоит в том, что я стараюсь избегать голосования по ответам на неконструктивные вопросы
комнат
1
@gnat, да, я думаю, я не думал, когда использовал слово « совершенный» , я не это имел в виду
tux91
3

Скрам сам по себе не предписывает никаких технических приемов, потому что это общая структура.

Гибкая разработка программного обеспечения требует от команды технического совершенства. Это вытекает из следующих технических приемов из XP (экстремальное программирование). Например, вы должны узнать о рефакторинге, tdd, всей команде, парном программировании, инкрементальном дизайне, ci, совместной работе и т. Д.

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

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

Мартин Викман
источник
Чего я не понимаю, так это «возможности справиться с изменениями быстро и безопасно», поскольку это означает, что проект на основе водопада сложнее изменить. Это почему? Это просто кодовая база. Укажите, что нужно изменить, спроектируйте и как это вписывается в существующую архитектуру, код, тестирование и выпуск. Только не называйте это спринтом, а называйте это вехой. Не похоже, что это займет больше времени или создаст больше трудностей, чем проворный. Разница в том, что вы делаете более тщательное планирование, но вам не нужно делать что-то строго XP.
tux91
@ tux91 Обновил мой ответ. Что касается архитектуры, я рекомендую прочитать это или посмотреть это в 26:20 о том, что мы называем «инкрементным дизайном».
Мартин Уикман,
2

Для меня главное преимущество agile - это снижение рисков в проекте.

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

Вы можете утверждать, что это постоянное изменение ставит под угрозу вашу систему и снижает качество, но я бы сказал, две вещи. 1) Это изменение в любом случае происходит в более традиционных проектах доставки программного обеспечения - оно просто не учтено и происходит позже в проекте, когда, как вы указали, что-то сложнее и дороже изменить. 2) Agile может многое сказать о том, как справиться с этим изменением с точки зрения использования опытных и мотивированных людей, таких как TDD, сопряжение и проверка кода. Без этого изменения в мышлении к качеству и постоянному улучшению, я признаю, что частые изменения, которые подразумевает гибкая гибель, могут начать вызывать проблемы.

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

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

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

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

Эрик Дитрих
источник
0

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

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

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

JeffO
источник