Инженерия требований

Неоднозначность и нужная степень детализации

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

По материалам: Д. Леффингуэлл, Д. Уидриг, «Принципы работы с требованиями к программному обеспечению», гл. 26; глава опирается на книгу Д. Гауса и Дж. Вайнберга (D. Gause, G. Weinberg) «Exploring Requirements».

На этой странице

Главные идеи#

Золотая середина#

Леффингуэлл и Уидриг говорят, что чаще всего им задают один вопрос: насколько подробным должно быть требование, чтобы его не поняли неправильно? Промахнуться можно в обе стороны:

  • Слишком мало деталей. Неоднозначность растёт, пока уже никто не может сказать, что имелось в виду.
  • Слишком много деталей. Понимание снова падает. Пользователи не станут читать перегруженную спецификацию, а исполнители за деталями теряют из виду цель.

Цель — зона, где требование одновременно понятно и однозначно.

Пример с мигающей лампой#

Возьмём требование к прибору с двумя лампами: если одна из ламп перегорит, другая должна мигать раз в секунду. Звучит ясно, пока программисту не приходится выбирать рабочий цикл. Полсекунды горит и полсекунды не горит — или девять десятых секунды горит и одну десятую нет? В обоих случаях лампа мигает раз в секунду. Для простого индикатора разница никого не волнует. Но если такая же расплывчатость описывает выходную мощность хирургического инструмента, она может навредить пациенту.

Авторы делают вывод: нужная степень детализации зависит от двух вещей:

  1. Последствий неверного прочтения в данном приложении.
  2. Способности исполнителей самостоятельно делать правильный выбор или вовремя задать вопрос.

«Mary had a little lamb» («У Мэри был барашек»)#

Леффингуэлл и Уидриг заимствуют упражнение у Гауса и Вайнберга. Посмотрите в словаре значения двух слов из этой известной строки английского детского стишка: had и lamb. Значения had — от «владела» до «подкупила»; lamb — от «ягнёнок» до «простак, которого легко обмануть». В сочетании они дают больше десятка допустимых прочтений. Фраза, которая кажется совершенно ясной людям с общим опытом, может значить совсем другое для тех, у кого этого опыта нет, — а именно в таком положении находятся разработчики, когда читают требования пользователей.

Три эвристики для поиска неоднозначности#

Эти эвристики придумали Гаус и Вайнберг, а Леффингуэлл и Уидриг их пересказывают:

  • Запоминание. Попросите нескольких человек — из разработки и из бизнеса — записать требование по памяти. Части, которые им трудно воспроизвести точно, вероятно, неоднозначны. Перепишите их.
  • Ключевые слова. Выберите ключевые слова, выпишите их возможные значения из авторитетного источника, скомбинируйте прочтения и проверьте, что подразумевается ровно одно.
  • Ударение. Прочитайте требование вслух несколько раз, каждый раз выделяя голосом другое слово. Каждое ударение может открыть новое прочтение. Если подразумевается только одно, перепишите требование так, чтобы оно стало явным; если верны несколько, возможно, нужны отдельные требования.

Там, где недопонимание недопустимо, переходите к формальным методам: псевдокоду, конечным автоматам или таблицам решений.

Рекомендации авторов#

  • Используйте естественный язык везде, где можно.
  • Добавляйте рисунки и диаграммы.
  • Спрашивайте, когда сомневаетесь, — и спрашивайте, даже когда сомнений нет.
  • Применяйте формальные методы там, где неверное прочтение недопустимо.
  • Учите команду распознавать неоднозначность, а не только исправлять отдельные случаи.

Как применять#

  1. Оцените риск. Для каждой области требований спросите, насколько плохим будет неверное прочтение (досадным, дорогим, опасным) и насколько хорошо исполнители знают предметную область.
  2. Задайте степень детализации. Высокий риск и исполнители, для которых предметная область нова, требуют максимума деталей, моделей или формальных методов. При низком риске и опытных исполнителях, которые легко могут задать вопрос, хватит коротких формулировок и разговора.
  3. Выберите рискованные пункты и проверьте их эвристикой ударения на коротком ревью.
  4. Проведите проверку запоминанием для самых важных пунктов — с одним представителем бизнеса и одним разработчиком.
  5. Проведите проверку ключевых слов для терминов, которые встречаются во многих требованиях, и внесите согласованные значения в глоссарий.
  6. Повышайте формальность там, где неоднозначность остаётся: переходите к диаграмме, таблице решений или прототипу.

Пример#

У «Мастерской», вымышленной сети веломастерских, есть требование: «Уведомить клиента, когда велосипед готов». Чтение с ударением выявляет:

  • Уведомить — по SMS, электронной почте, звонком или сообщением в приложении?
  • клиента — того, кто записался, или владельца велосипеда (родитель записывает ребёнка)?
  • когда — сразу или только в рабочие часы?
  • велосипед — один велосипед или все велосипеды, если в записи их несколько?
  • готов — ремонт закончен, финальная проверка безопасности подписана или заказ оплачен?

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

Подводные камни#

  • Полагаться на дружеские вычитки. Каждый читатель видит одно прочтение и остаётся доволен. Используйте эвристики или формальное ревью.
  • Одна степень детализации для всего. Областям, связанным с безопасностью или договорными обязательствами, нужно больше деталей; хорошо понятным областям — меньше.
  • Избыточная детализация для экспертов. Опытная команда, которую завалили деталями, теряет из виду цель.
  • Считать неоднозначность только проблемой формулировки. Иногда за ней стоит непринятое решение; найдите, кто должен его принять.

Источники и что почитать#

  • D. Leffingwell, D. Widrig. Managing Software Requirements: A Unified Approach. Addison-Wesley, 2000. Рус. изд.: Д. Леффингуэлл, Д. Уидриг. Принципы работы с требованиями к программному обеспечению. Унифицированный подход. М.: Вильямс, 2002. Гл. 26.
  • D. Gause, G. Weinberg. Exploring Requirements: Quality Before Design. 1989 — источник упражнения «Mary had a little lamb» и эвристик запоминания, ключевых слов и ударения.