Формулирование и планирование проекта.
Глава 8
Требования
В этой главе рассматривается процесс формулирования требований к программному продукту. Каждый член команды разработчиков должен чётко представлять, какую программу нужно создать, для чего она предназначена и каковы её возможности — иначе у вашего проекта не будет ни единого шанса на успех. Проще всего добиться этого понимания с помощью чётко определённого и строго контролируемого набора требований. Но не менее важна возможность улучшения программного продукта и переработки некоторых его фpaгментов. Проект должен допускать постепенное улучшение программы вплоть до добавления одних функций и удаления других. Эти две потребности — строгий контроль и свобода развития — часто выглядят взаимоисключающими, поэтому рассмотрим каждую из них.
Для первой требуется чётко сформулированный, подробный и строгий список требований, оговаривающий практически все особенности продукта. Его дополняет жёстко заданный набор процессов, управляющих внесением изменений. Проблема этого метода заключается в трудности создания такого списка требований, особенно при работе в новых, неразработанных областях. Кроме того, он с трудом обеспечивает постепенное улучшение продукта и организацию обратной связи. Даже если создать подробный список требований было бы возможно, то в письменной форме он часто терял бы свою однозначность, а поддерживать его в актуальном виде было бы довольно трудно.
Второй подход утверждает, что достаточно лишь создать простой список требований в общей формулировке. Идея в том, чтобы дать разработчикам свободу принимать решения о реализации основных функций продукта во время его разработки. Более динамичная среда позволит разработчикам оперативно воплощать новые идеи и адекватно реагировать на потребности рынка. Однако этот подход полон неопределённости и риска: трудно планировать рабочий процесс, а управлять — ещё труднее. Это также негативно сказывается на тестировании и создании документации, так как до самого выпуска, т.е. до выяснения истинной картины функциональности продукта, сведений о продукте для начала работы будет недостаточно.
У каждого подхода свои преимущества, но какой же из них выбрать? Нужно, ещё до начала написания кода, установить фундаментальные требования, но при этом иметь возможность вносить контролируемые изменения во время цикла разработки. Давайте обсудим процесс управления требованиями, который позволит их сбалансировать.
Центральная идея проекта
В начале работы над каждым выпуском нужно добиться простого и ясного видения проблемы, при котором задачи и приоритеты проекта стали бы очевидными для всех его участников; критически важно объединить их усилия и гарантировать, что группа будет работать сообща.
Атрибутом хорошего видения проблемы является центральная идея (лейтмотив проекта), которая сплотит группу и даже всю компанию воедино. Она должна не только направлять усилия при разработке, но и способствовать позиционированию, сбыту и продвижению продукта на рынке. Вокруг неё должны объединиться все группы, обеспечивающие коммерческий успех продукта.
Хотя у крупных проектов может быть несколько таких идей, распыляться всё же не стоит. Основная идея проекта должна быть сформулирована кратко и ясно, в ней должен быть призыв к превосходству в одной-двух областях. Выбрать её нелегко, обычно такая идея является результатом тщательного анализа рынка и состояния бизнеса в данной области. Убедитесь, что достижение цели, поставленной основной идеей, принесёт значительную прибыль.
Мы в NuMega всегда пытались сделать выпуск каждого продукта волнующим событием, претендуя на самый короткий срок его создания, либо на первенство в использовании новых технологий, вплоть до того, что целью ряда наших проектов было получение премий в нашей отрасли. Вот ряд идей, которые в прошлом позволили эффективно объединить наши усилия по разработке:
• закрыть путь на рынок новым конкурентам, предоставив программистам на языке C/C++ продукт с самым полным набором функций по обнаружению ошибок;
• создать продукт для анализа производительности, самый простой в эксплуатации во всей отрасли, и добиться признания этого факта;
• создать самый мощный и функционально насыщенный отладчик ядра Windows NT.
Мы руководствовались этими идеями при выборе функций продукта и в процессе их реализации. Они также играли главную роль, когда приходилось идти на компромисс. Например, если приходилось выбирать одну из двух взаимоисключающих возможностей, достаточно было одного взгляда на центральную идею проекта, чтобы стало ясно, какую из них выбрать.
Поиск и решение пользовательских проблем
Сформулировав центральную идею проекта, надо сосредоточиться на потребностях пользователя. На этом этапе процесса формулирования требований следует рассматривать те проблемы, что необходимо решить пользователю, а не конкретные действия, которые он хотел бы выполнять. Возьмём в качестве примера одну из формулировок идеи проекта из предыдущего раздела. Если нужно предоставить программистам на C/C++ наиболее полный продукт для обнаружения ошибок, то надо выяснить, какие ошибки являются наиболее распространёнными и труднее всего поддаются обнаружению. Вот ещё один пример: если нужен самый простой в использовании продукт для анализа производительности, нужно понять, какие сведения о производительности критичны для пользователей и в каком виде они хотели бы их получить.
Чтобы понимать пользовательские проблемы, важно поддерживать обратную связь с клиентами для проверки сделанных предположений. Лучший способ убедиться в разумности своих планов и преодолеть внутренние разногласия — иметь обратную связь, заслуживающую доверия.
Из собственного опыта
При работе над BoundsChecker 3.0 было много прений вокруг набора функций продукта. Несколько недель обсуждения этого предмета, порой доходившего до жарких споров, прошли без видимого прогресса. Было принято совместное соглашение оставить этот вопрос, чтобы избежать возобновления споров. Чтобы выйти из тупика и поднять боевой дух группы, мы решили пригласить группу заказчиков и потенциальных пользователей на вечеринку с угощением и раздачей призов. Там мы продемонстрировали разные идеи о возможных функциях программы и попросили приглашённых высказать своё мнение. На основе информации извне стало намного легче прийти к компромиссу и выработать решение, у которого были неплохие шансы на успех.
Формулирование требований
Когда установлено общее видение проекта и достигнуто понимание пользовательских проблем, пора переходить к определению требований. Как сформулировать требования, насколько подробными должны быть формулировки и как ничего не упустить?
Общие и частные требования
Один из лучших способов дать чёткое описание набора требований к проекту — представить его в виде схемы. Самый высокий уровень схемы занимают общие требования. Они объединяют совокупности частных требований, которые, таким образом, можно обсуждать, оценивать, сравнивать и утверждать как единое целое. Нужно иметь возможность анализа общих требований и обладать совершенным пониманием их основных целей. Общих требований не должно быть слишком много, так как каждое в свою очередь генерирует ряд второстепенных требований. Например, в случае компании, которой надо адаптировать имеющееся приложение обработки заказов для работы в Интернете, достаточно пяти общих требований:
• разработать интерфейс на базе браузера;
• повысить производительность до уровня, приемлемого для Web-пользователей;
• организовать рассылку уведомлений о выполнении заказов по электронной почте;
• добавить к программе новые возможности, которые повысят производительность пользователей;
• предусмотреть применение в будущем в качестве клиентской платформы карманных компьютеров.
Каждое общее требование должно подразделяться на несколько частных. С последними могут быть связаны и другие требования, конкретизирующие или поясняющие функциональность требований более высокого уровня. В результате документация может принять такой вид:
• Общее требование 1
•• Частное требование 1
••• Частное требование нижнего уровня 1.1
••• Частное требование нижнего уровня 1.2
•• Частное требование 2
••• Частное требование нижнего уровня 2.1
••• Частное требование нижнего уровня 2.2
Ниже приводится пример некоторых общих и частных требований, организованных в соответствии с вышеописанной структурой.
• Разработать интерфейс на базе браузера для приложения по обработке заказов.
• Функциональные требования.
•• При размещении заказа:
••• Ввести для каждого заказа следующую информацию (по пунктам).
••• Проверить идентификатор покупателя.
•• Удалить заказ.
•• Проверить статус заказа.
•• Сгенерировать подтверждение заказа.
• Обеспечить поддержку следующих браузеров:
•• Microsoft Internet Explorer версии X.
•• Netscape версии Y.
• Производительность должна быть приемлема для Web-пользователя.
• Требования ко времени реакции системы:
•• Размещение заказа должно занимать менее 3 секунд.
•• Удаление заказа должно занимать менее 6 секунд.
•• Проверка статуса заказа должна занимать менее 4 секунд.
•• Подтверждение заказа должно занимать менее получаса.
• Облегчить использование приложения с помощью новых возможностей:
•• Разрешить заказ нескольких товаров в одном заказе.
•• Разрешить пользователю просмотр его идентификатора покупателя.
Как видно из этого примера, каждое общее требование включает набор поддерживающих его требований, которые конкретизируют или разъясняют содержание «родительского». Каждое поддерживающее требование сформулировано просто и ясно, что позволяет легко проследить его реализацию в данном выпуске ПО. Следует расширять степень детализации спецификации требований, пока не будут описаны все ключевые элементы функциональности и вы не останетесь довольны созданным описанием.
Полнота требований
Определение требований должно быть полным. Рассмотрите все аспекты нового выпуска, даже те, что нельзя свести к набору частных требований. Далее приводится список общих категорий требований, применимый практически ко всем проектам по созданию программ. Я не предлагаю использовать этот список в том виде, в каком он представлен здесь, хотя возможно и такое; однако при составлении собственного списка требований рассмотрите каждую из следующих категорий.
• Задачи и функции проекта
Каждый участник должен понять ключевые задачи и функции проекта, прежде чем приступать к работе. Эти задачи и функции составляют сущность программного продукта и будут направлять его разработку, а также работу по тестированию и обучению пользователей.
• Пользовательский интерфейс
Хотя при работе над пользовательским интерфейсом придётся дать ответ на два важных вопроса: «Как пользователю выполнить действие X?» и «Как должна выглядеть функция Y?», лучше не пытаться формализовать их, так как это слишком затруднит описание, тестирование и реализацию последовательных улучшений. Вместо этого надо разработать визуальную модель приложения с помощью различных методик конструирования прототипов пользовательского интерфейса. Эта модель и будет спецификацией требований к пользовательскому интерфейсу. (Подробнее об этот см. главу 9. Там же я расскажу об эффективных способах формулирования и анализа требований к пользовательскому интерфейсу программного продукта.) При наличии конкретной платформы, технологий или связанных с бизнесом ограничений, влияющих на структуру интерфейса, важно оговорить их заранее.
• Среда
Необходимо описание программной и аппаратной среды, в которой будет работать продукт. В описании должны быть чётко указаны конкретные версии существующего ПО с учётом новых выпусков, которые могут стать доступными к окончанию работы над проектом. Не забывайте о проблемах, связанных с глобализацией: поддержке ОС, местных языков, валют и различий в часовых поясах.
• Интеграция
Определите потребности, связанные с интеграцией и возможностью взаимодействия с существующими программами и оборудованием. При необходимости интеграции новой программы с существующими решениями, следует указать способ её осуществления и поддерживаемые версии программного и аппаратного обеспечения.
• Производительность
Определите ожидаемую производительность продукта. Обозначьте в простом виде значения параметров, которые нужно достигнуть, а также возможные способы измерения этих параметров. Следует подумать и о времени реакции системы в зависимости от типов нагрузки и потребностей пользователей.
• Установка
Уделите внимание установке ПО. В определении требований должны обсуждаться по крайней мере действия, которые должен выполнить пользователь, чтобы установить ПО, а также действия самой программы установки, необходимые для завершения процесса установки. Кроме того, укажите платформы, которые должна поддерживать программа установки.
• Тестирование
Требования к тестированию продукта могут не только способствовать существенному повышению продуктивности работы, но и принести дополнительные выгоды. Так, если в программе установки предусмотрен режим, не требующий ручного ввода информации, можно будет автоматически устанавливать и тестировать все ежедневные сборки программы. Не исключено, что программный продукт должен будет поддерживать набор API, позволяющих группе, проводящей испытания, читать любые двоичные файлы, используемые или генерируемые приложением. Это позволит сравнивать файлы, полученные в результате нескольких испытаний программы с последовательно изменёнными параметрами. Также можно заставить программу вести протокол внутренних несогласованностей, который будет полезен при диагностике трудно воспроизводимых сбоев в работе программы.
Детализация требований
Ещё одна проблема, которую придётся решить, — насколько подробно нужно формулировать требования. Разумеется, в данном случае задача в том, чтобы определение было как можно полнее: чем подробнее описано требование, тем легче следить за ходом его реализации. Чем больше аспектов определено заранее, тем больше параллелизма в работе разработчиков и групп, отвечающих за тестирование, обучение пользователей и выпуск программного продукта, так как тогда им проще понять, какой продукт создаётся. Однако часто подробно документировать требования очень трудно и даже невозможно, так как приходится работать в незнакомых областях (так чаще всего и бывает при работе над программными проектами). Как правило, чтобы понять, что именно пытаются создать участники проекта, приходится изрядно поэкспериментировать и испробовать много новых идей. Бывает и так, что поставленная цель оказывается вовсе недостижима. Ниже я опишу способ, позволяющий согласовать потребности в эксперименте и в документировании требований к проекту.
Недостаточно подробное определение обычно является следствием недостаточного понимания. Если недостающие сведения относятся к маркетингу или другим вопросам бизнеса, то разработчики мало чем помогут — это работа менеджера проекта и менеджера по маркетингу. Однако при нехватке сведений о реализуемых функциях, например, когда неясно, как работает та или иная функция, откуда берётся информация или чего хочет пользователь, можно создать прототип пользовательского интерфейса, иллюстрирующий внешний вид этих функций. Если недостающая информация касается технических возможностей, скажем, может ли программный продукт выполнять те или иные действия, можно провести анализ технической осуществимости, а затем создать прототип. Вот как свести воедино информацию из реального мира, экспериментальную работу и творческий процесс в процесс формулирования требований, прежде чем перейти к планированию (рис. 8-1).
Главная идея в том, чтобы заранее выяснить места возможного риска и до начала работы над проектом разработать решения потенциальных проблем. Анализ осуществимости и прототипы пользовательского интерфейса помогут понять суть проблемы, оценить потребности и снизить общий риск. Эти методики обеспечивают процесс формулирования требований обратной связью с внешним миром и позволяют составлять более детальные планы.
Рис. 8-1. Связь между требованиями, практичностью и созданием прототипа.
О базовых методиках анализа технического риска и создания прототипов пользовательского интерфейса, а также их использование для формулирования оптимальных требований см. главы 9 и 10.
Анализ требований
Когда требования сформулированы, но ещё не утверждены, разумно проанализировать их в целом и каждое по отдельности. Требования к новой программе нужно отбирать очень тщательно. Многие просто берут список требований, не анализируя его с точки зрения коммерческой привлекательности и не удаляя всё, что не вписывается в центральную идею проекта. В итоге получаются программы с плохо организованной функциональностью, не соответствующей назначению программы. Оценке требований и поиску направления, в котором движется разработка вашей программы, должно уделять большое внимание.
«Фрагментация» требований
Отойти от намеченного пути при формулировании требований легко. Так бывает, когда упрямый индивид или целая группа уводит «фокус» требований совсем в другую сторону, чем было задумано. Возможно, было легче формулировать требования для тех функций, определить которые было проще всего. Может оказаться и так, что требования сопряжены с чрезмерным для таких программ риском. Как бы ни было, обязательно должны присутствовать объективный взгляд на требования и оценка их влияния на ход проекта.
Категории требований
Ниже описаны четыре категории требований.
• «Опережающие» и «догоняющие» требования
Первые позволяют продукту обогнать конкурентов по рынку. Они могут описывать просто новое представление данных или возможность поддержки новой платформы. Им не обязательно быть революционными — достаточно, что они дают преимущество в конкуренции на момент выхода программы на рынок. Вторые подтягивают функциональность программы до уровня конкурентов. Они призваны сохранить конкурентоспособность и связаны с решением проблем сбыта и технической поддержки.
Разделение требований на категории «опережающих» и «догоняющих» позволяет проанализировать конкурентоспособность вашей программы. Например, если выяснилось, что в программе реализовано слишком мало опережающих требований или их вообще нет, можно реализовать дополнительные опережающие требования. Стратегия разработки программ в NuMega всегда включает ряд особенностей, которые делают программу уникальной на рынке и позволяют ей стать или остаться, так сказать, «чемпионом породы».
• Перспективные и ретроспективные требования
Последние направлены на решение проблем, связанных с прошлыми выпусками ПО. Например, для решения проблем с производительностью и удобством использования в последнем выпуске в общем случае служат ретроспективные требования. Так как эти требования — не что иное, как реакция на существующий продукт в существующем окружении, их реализация позволяет улучшить продукт, но не предвосхитить будущие потребности.
Перспективные требования позволяют заранее побеспокоиться о будущих потребностях заказчика. Они основаны на уверенности в том, что заказчик обязательно изменит свои потребности и желания, даже если сам он ещё об этом не знает. Часто перспективные требования базируются на крупномасштабных изменениях в деловой практике (например, на повсеместном внедрении размещения заказов через Web), технологиях (появление платформ, поддерживающих беспроводную связь) или рынка (слияние двух конкурировавших фирм). Перспективные требования труднее всего сформулировать, но, если удастся верно предугадать нужды потребителя и не ошибиться с выбором рынка и функций ПО, результатом будет значительное преимущество перед конкурентами.
Подборка ретроспективных и перспективных требований должна соответствовать потребностям, которые призван удовлетворить продукт, особенностям рынка и задачам выпуска. Скажем, можно быстро (за полгода) подготовить выпуск, в котором будет реализован ряд ретроспективных требований, а также включить в него несколько перспективных требований, чтобы не упустить какую-то интересную возможность.
Перспективные требования вовсе не обязательно являются копией опережающих. Перспективные требования именно предвосхищают потребности, в то время как опережающее требование может быть основано на текущих потребностях клиента, оставленных без внимания конкурентами. Так, введение поддержки диаграмм и графиков и нового одноэтапного процесса ввода данных можно считать опережающими, но никак не перспективными. С другой стороны, поддержку карманных компьютеров можно одновременно рассматривать, как опережающее и как перспективное требование, которое приносит двойную выгоду.
Наглядное представление требований
Чтобы понять сформулированные требования в общем, можно использовать таблицу для анализа требований, расписав их по ячейкам таблицы. Эта таблица имеет вид квадрата. поделённого на четыре равные части. Ниже по одной оси находятся догоняющие и опережающие требования, а по другой — перспективные и ретроспективные требования (рис. 8-2).
Рис. 8-2. Набор требований, представленный в виде таблицы из четырёх ячеек.
Далее приводится описание содержимого каждой ячейки таблицы. Расписав собственные требования по ячейкам такой таблицы, вы поймёте, в каком направлении пойдёт работа.
Ячейка 1. Вы предвидите будущие потребности потребителей и будете первым производителем, предоставившим соответствующее решение. Эти потребности пока ещё не до конца поняты и не полностью установлены. Вы первопроходец в этой области, поэтому уровень риска довольно высок. Из-за множества «неизвестных» нельзя заранее предоставить подробное определение требований. Основное внимание должно быть уделено созданию и последовательному улучшению прототипа ПО. Потребуется очень быстро пересматривать структуру ПО в процессе разработки, привлечь для тестирования реальных пользователей и обновить требования до начала этапа планирования.
Ячейка 2. Ряд возможностей ПО, созданного конкурентами, предвосхищают нужды потребителей, поэтому хотелось бы наверстать упущенное. Следует изучить предложения конкурентов, понять, что они сделали правильно, а что — нет, и извлечь урок из допущенных ими ошибок. Риск, связанный с требованиями из этой ячейки, меньше в сравнении с риском в ячейке 1, так как уже существуют программные продукты, способные стать материалом для изучения и извлечения уроков. Однако следует ожидать быстрого изменения рынка и потребностей клиентов, поэтому, прежде чем перейти к формализации требований и созданию плана проекта, придётся затратить много усилий на моделирование технических характеристик и анализ удобства использования.
Ячейка 3. Наверное, реализация требований из этой ячейки доставит меньше всего хлопот, так как нужно предоставить уникальный в отраслевом масштабе набор возможностей без риска ошибиться в прогнозе тенденций рынка. Поскольку вы работаете с хорошо известным и заслуживающим доверия заказчиком, риск при разработке ПО такого типа обычно связан с верной реализацией функций и своевременным завершением разработки, а не с применением инновационных технологий.
Ячейка 4. Тактика заключается в расширении функциональности продукта, который уже поставляют конкуренты. Риск в случае такого ПО должен быть относительно невелик, так как вы работаете в основном с хорошо известными функциями и технологиями на устоявшемся рынке. Поскольку риск столь мал, на тестирование удобства использования и последовательное улучшение прототипа уйдёт меньше времени, чем в других случаях.
Помните: задача — обеспечение желаемого коммерческого эффекта при реализации сформулированных вами требований. Хотя вполне можно создать набор требований, распределяющийся по ячейкам таблицы практически поровну, в общем случае это нежелательно, поскольку так можно легко отойти от намеченной цели. Намного лучше сосредоточить большинство требований в одной из ячеек, а остальные требования разместить ещё в одной-двух ячейках.
Определение приоритетов
Определив и проанализировав требования, вы вплотную приблизились к обладанию полным набором функциональности. Но, прежде чем идти дальше, нужно задать приоритеты требований. Это поможет заранее оценить важность каждого требования и понять, как они связаны с другими требованиями.
Почему это так важно
Расстановка приоритетов определяет планирование и распределение задач. Вообще при планировании стараются наметить окончание реализации наиболее критичных требований на максимально ранние сроки. Если сначала сконцентрировать усилия команды на воплощении самых важных требований, можно снизить неопределённый риск, неизбежно присутствующий в любом плане. После завершения реализации критичных функций новая программа уже будет жизнеспособной. Если на этом этапе придётся сжимать сроки или вносить непредвиденные изменения, то вы окажетесь в выигрышном положении и сможете быстро завершить работу над новым выпуском программы, так как её основные функции будут уже готовы.
Коллектив должен заранее прийти к соглашению об уровне приоритета каждого из требований. Лучше, чтобы в момент принятия трудных решений (если такой момент настанет) об исключении той или иной функции вами не владели эмоции и напряжённость ситуации, что может сказаться на принятии решения. Не должно быть никаких сомнений в том, какие функции обязательны, а какие — нет. Приоритетные функции данного выпуска должны быть ясны каждому участнику проекта.
Как это делается
Каждому требованию должен быть назначен тот или иной приоритет. Детализация приоритетов может быть любой, в зависимости от потребностей. Уровни приоритета можно определить следующим образом:
• Необходимые
Обязательно должны быть воплощены в программе, без этого её нельзя выпускать на рынок. Необходимые функции должны быть реализованы и испытаны как можно раньше; этому нужно уделить максимум внимания и все ресурсы.
• Желательные
Присутствие этих требований крайне желательно. При достаточном обосновании от их реализации можно отказаться, но это не уменьшает важности их наличия в программе. Реализация и испытания желательных требований начинается сразу после обязательных.
• Возможные
Эти требования также желательны, но реализуются в последнюю очередь и являются первыми кандидатурами на удаление, если вдруг возникнут проблемы со сроками.
Утверждение требований
Многие ошибочно считают, что сформулировав требования, они готовы к распределению заданий и планированию проекта. Это не так. Нужно выполнить ещё два важных действия: провести техническую экспертизу основных факторов риска, связанных с технологиями, и создать прототип пользовательского интерфейса вашей программы. См. об этом главы 9 и 10.
Представим на минуту, что прототип пользовательского интерфейса уже готов и технологическая экспертиза закончена. Готовы ли вы поставить свою подпись на списке требований? Ещё нет. Нельзя утверждать требования, пока не составлен план работы. Может оказаться, что на исполнение плана должно уйти слишком много времени, и придётся отказаться от реализации части требований. Если требования уже утверждены, то может оказаться, что при их реализации не удастся уложиться в заданные временные рамки. Не стоит утверждать требования поодиночке, пока не будет ясности с другими требованиями.
Управление внесением изменений
Разработка ПО — динамический процесс. Не важно, насколько всеохватывающими будут начальные требования — все равно по мере продвижения по циклу разработки придётся вносить изменения. Постоянно возникают неожиданные проблемы, рождаются идеи, меняются потребности рынка. Однако изменчивость требований — не самая большая проблема. Важнее организовать работу, чтобы поднимать эти проблемы для последующего решения, направлять процесс принятия решений и доводить результаты до сведения коллектива.
Вот ряд фундаментальных принципов, которые нужно учитывать:
• Создавайте команду в составе менеджера проекта и всех руководителей групп, которая будет рассматривать все вносимые изменения
Команда должна регулярно собираться, ответственно подходить к рассмотрению запросов на внесение изменений и гарантировать, что руководитель каждой группы может оценить эффект изменения. Менеджер проекта должен следить, чтобы рассмотрение запросов на внесение изменений шло эффективно, а рассматриваемые запросы не выходили за рамки компетенции команды. Он также должен изучать влияние изменений на план исполнения проекта. При внесении изменений нужно пересмотреть и соответствующим образом изменить план.
• Необходимо не только разрешить, но и стимулировать группы, ответственные за реализацию определённых функций, к улучшению этих функций ПО
Такая свобода поможет им быстрее пересматривать и улучшать продукт. Однако недопустимо, чтобы улучшения частных особенностей или более тонкая настройка негативно отражалась на исполнении проекта. Если изменение влияет на требования или на его внесение уйдёт больше времени, чем допускает план, при обработке запроса на внесение этого изменения нужно обязательно следовать вышеописанной процедуре.