То, что вы описываете, - по крайней мере, по моему опыту, - довольно распространенный шаблон команд, пытающихся «быть проворными». Открыто для обсуждения, если это на самом деле является частью самого Agile или является его неправильной реализацией, противоречит проворному манифесту / принципам или его неотъемлемым следствиям и так далее. Просто с эмпирической точки зрения и только на основании моего собственного небольшого выборочного опыта (и людей, с которыми я общаюсь), если команда гибкая, у нее больше шансов столкнуться с этой моделью. Давайте просто оставим это и сосредоточимся на вашем конкретном примере.
Есть два отдельных аспекта того, что вы описываете:
- Отсутствует общее понимание / видение и, следовательно, не быть эффективным
- Как измерить успех / прогресс и общую стоимость
Идти по неверному пути или бегать кругами
По моему опыту, главная причина этого состоит в том, что, пытаясь быстро создать код, команды активно откладывают случаи использования или требования, которые они уже знают или о которых легко могут узнать. Думайте об этом так: 10-20 лет назад люди пытались написать гигантские спецификации и думать обо всем заранее и часто терпели неудачу. Они либо заняли слишком много времени, либо что-то упустили. Одним из уроков прошлого было то, что в разработке программного обеспечения есть вещи, которые вы не можете знать, и вещи сильно меняются, отсюда и идея быстрой итерации и быстрого получения некоторого осмысленного результата. Это очень хороший принцип. Но сегодня мы находимся в другой крайности: «Меня это не волнует, потому что это часть следующего спринта» или «Я не регистрирую эту ошибку, я имею дело с ней, когда она появляется снова».
- Соберите все высокоуровневые сценарии использования , требования, зависимости и ограничения, которые вы можете найти. Поместите это в некоторые вики, чтобы все заинтересованные лица и разработчики могли их видеть. Добавьте к ним, когда появится что-то новое. Поговорите с вашими акционерами и пользователями. Используйте это как контрольный список при разработке, чтобы предотвратить реализацию вещей, которые не вносят вклад в конечный продукт или являются обходными путями / взломами, которые решают одну проблему, но вызывают три новых.
- Сформулируйте концепцию высокого уровня . Я не говорю о разработке интерфейсов или классов, но вместо этого в общих чертах очерчиваю проблемную область. Каковы основные элементы, механизм и взаимодействия в конечном решении? В вашем случае это должно быть очевидно при использовании jquery-обходного решения в качестве промежуточного шага и когда это только вызывает дополнительную работу.
- Подтвердите свою концепцию, используя список, который вы собрали. Есть ли в этом явные проблемы? Имеет ли это смысл? Существуют ли более эффективные способы достижения той же ценности для пользователя, не вызывая долгосрочную техническую задолженность?
Не переусердствуйте. Вам просто нужно что-то, чтобы у всех в команде (включая не разработчиков) было общее понимание того, каков наилучший путь к вашему MVP. Все должны согласиться с тем, что нет очевидных упущений, и это может сработать. В целом это помогает предотвратить тупик или необходимость повторять одно и то же несколько раз. Agile может помочь вам лучше справляться с неожиданностями, это не аргумент игнорировать то, что известно.
Имейте в виду ошибочную стоимость : если вы начинаете с одной архитектуры или типа базы данных, большинство людей не решаются изменить ее в середине проекта. Так что это хорошая идея - потратить некоторое время на то, чтобы получить «обоснованное лучшее предположение», прежде чем приступить к реализации. У разработчиков есть тенденция быстро писать код. Но часто наличие пары макетов, живых прототипов, скриншотов, каркасов и т. Д. Позволяет выполнять итерацию еще быстрее, чем написание кода. Просто помните, что каждая написанная строка кода или даже модульные тесты затрудняют повторное изменение вашей общей концепции.
Измерение успеха
Совершенно отдельный аспект - как вы измеряете прогресс. Допустим, цель вашего проекта - построить башню высотой 1 м из лежащих вокруг вещей. Построение карточного домика может быть вполне приемлемым решением, если, например, время выхода на рынок более важно, чем стабильность. Если ваша цель состоит в том, чтобы создать что-то, что длится долго, использование Lego было бы лучше. Суть в том, что считать хаком и какое элегантное решение целиком зависит от того, как измеряется успех проекта .
Ваш пример «загрузки» довольно хорош. У меня были такие вещи в прошлом, когда все (включая продажи, ПО, пользователей) соглашались, что это раздражает. Но это никак не повлияло на успех продукта и не вызвало долгосрочных долгов. Таким образом, мы отбросили его, потому что были более ценные вещи, связанные с dev-ресурсами.
Мой совет здесь:
- Сохраняйте все, даже небольшие ошибки, как билеты в вашей системе тикетов . Примите активное решение, что находится в рамках проекта, а что нет. Создайте вехи или иным образом отфильтруйте ваш журнал, чтобы у вас всегда был «полный» список всего, что еще нужно сделать.
- Имейте строгий порядок важности и четко обозначенную точку, в которой проект можно считать успешным. Какой уровень стабильности / качества кода / документации на самом деле нужен конечному продукту? Старайтесь проводить каждый день работы как можно лучше, выбирая сверху. При работе с одним тикетом, попытайтесь решить его полностью, не вводя новые тикеты (если нет смысла откладывать вещи из-за более низкого приоритета). Каждый коммит должен вести вас вперед к конечной цели, а не в сторону или назад. Но еще раз подчеркну: иногда взлом, который впоследствии производит дополнительную работу, все же может быть чистым позитивом для проекта!
- Используйте ваше ПО / пользователей, чтобы выяснить пользовательскую ценность, но также попросите ваших разработчиков определить стоимость технологий . Не разработчики, как правило, не могут судить, какова истинная долгосрочная стоимость (а не только стоимость внедрения!), Поэтому помогите им. Помните о проблеме с кипящей лягушкой: множество мелких, не относящихся к делу проблем со временем может привести команду в замешательство. Попробуйте определить, насколько эффективна ваша команда.
- Следите за общей целью / расходами. Вместо того, чтобы думать от спринта к спринту, лучше подумайте: «Можем ли мы как команда сделать все необходимое до конца проекта» . Спринты - просто способ сломать вещи и иметь контрольные точки.
- Вместо того, чтобы показывать что-то раньше, проложите свой курс по самому быстрому пути к минимально жизнеспособному продукту, который можно дать пользователю. Тем не менее, ваша общая стратегия должна предусматривать поддающиеся проверке результаты между ними.
Поэтому, когда кто-то делает что-то, что не вписывается в вашу конечную цель реализации, в идеале не считайте историю законченной. Если полезно закрыть историю (например, чтобы получить обратную связь от клиентов), немедленно откройте новую историю / ошибку, чтобы устранить недостатки. Сделайте прозрачным, чтобы использование ярлыков не уменьшало затраты, а просто скрывало или задерживало их!
Хитрость заключается в том, чтобы спорить с общей стоимостью проекта: если, например, ПО настаивает на принятии ярлыков, чтобы сделать крайний срок, количественно определить объем работы, которая должна быть выполнена впоследствии, чтобы считать проект выполненным!
Также остерегайтесь оптимизации на основе критериев : если ваша команда измеряется количеством историй, которые они могут показать в обзоре спринта, лучший способ получить хороший «балл» - это разрезать каждую историю на десять крошечных. Если он измеряется количеством написанных модульных тестов, он будет иметь тенденцию писать множество ненужных. Не считайте истории, скорее измерьте, сколько работает необходимого пользовательского функционала, насколько велика стоимость за счет технического долга, который необходимо решить в рамках проекта, и т. Д.
Резюме
Чтобы свести это к минимуму: быстрый и минимальный подход - это хороший подход. T он проблема заключается в интерпретации «быстрой» и «минимальный». Всегда следует учитывать долгосрочную стоимость (если у вас нет проекта, где это не имеет значения). Использование ярлыка, который занимает всего 1 день, но приводит к техническому долгу в 1 месяц после даты доставки, обходится вашей компании дороже, чем решение, которое заняло 1 неделю. Немедленно начать писать тесты, кажется, быстро, но не в том случае, если ваша концепция ошибочна, и они цементируют неправильный подход.
И помните, что означает «долгосрочный» в вашем случае: я знаю более одной компании, которая обанкротилась, пытаясь написать отличный код и, следовательно, отправила ее слишком поздно. Хорошая архитектура или чистый код - с точки зрения компании - ценна только в том случае, если затраты на ее достижение меньше, чем затраты на ее отсутствие.
Надеюсь, это поможет!