Неоднозначность и нужная степень детализации
Коротко Универсально правильной степени детализации не существует. Леффингуэлл и Уидриг описывают «золотую середину», где понимание наибольшее, а неоднозначность наименьшая; где именно она находится, зависит от того, во что обойдётся неверное прочтение и насколько способны исполнители. Три простые эвристики помогают найти неоднозначность до того, как она попадёт в код.
По материалам: Д. Леффингуэлл, Д. Уидриг, «Принципы работы с требованиями к программному обеспечению», гл. 26; глава опирается на книгу Д. Гауса и Дж. Вайнберга (D. Gause, G. Weinberg) «Exploring Requirements».
На этой странице
Главные идеи#
Золотая середина#
Леффингуэлл и Уидриг говорят, что чаще всего им задают один вопрос: насколько подробным должно быть требование, чтобы его не поняли неправильно? Промахнуться можно в обе стороны:
- Слишком мало деталей. Неоднозначность растёт, пока уже никто не может сказать, что имелось в виду.
- Слишком много деталей. Понимание снова падает. Пользователи не станут читать перегруженную спецификацию, а исполнители за деталями теряют из виду цель.
Цель — зона, где требование одновременно понятно и однозначно.
Пример с мигающей лампой#
Возьмём требование к прибору с двумя лампами: если одна из ламп перегорит, другая должна мигать раз в секунду. Звучит ясно, пока программисту не приходится выбирать рабочий цикл. Полсекунды горит и полсекунды не горит — или девять десятых секунды горит и одну десятую нет? В обоих случаях лампа мигает раз в секунду. Для простого индикатора разница никого не волнует. Но если такая же расплывчатость описывает выходную мощность хирургического инструмента, она может навредить пациенту.
Авторы делают вывод: нужная степень детализации зависит от двух вещей:
- Последствий неверного прочтения в данном приложении.
- Способности исполнителей самостоятельно делать правильный выбор или вовремя задать вопрос.
«Mary had a little lamb» («У Мэри был барашек»)#
Леффингуэлл и Уидриг заимствуют упражнение у Гауса и Вайнберга. Посмотрите в словаре значения двух слов из этой известной строки английского детского стишка: had и lamb. Значения had — от «владела» до «подкупила»; lamb — от «ягнёнок» до «простак, которого легко обмануть». В сочетании они дают больше десятка допустимых прочтений. Фраза, которая кажется совершенно ясной людям с общим опытом, может значить совсем другое для тех, у кого этого опыта нет, — а именно в таком положении находятся разработчики, когда читают требования пользователей.
Три эвристики для поиска неоднозначности#
Эти эвристики придумали Гаус и Вайнберг, а Леффингуэлл и Уидриг их пересказывают:
- Запоминание. Попросите нескольких человек — из разработки и из бизнеса — записать требование по памяти. Части, которые им трудно воспроизвести точно, вероятно, неоднозначны. Перепишите их.
- Ключевые слова. Выберите ключевые слова, выпишите их возможные значения из авторитетного источника, скомбинируйте прочтения и проверьте, что подразумевается ровно одно.
- Ударение. Прочитайте требование вслух несколько раз, каждый раз выделяя голосом другое слово. Каждое ударение может открыть новое прочтение. Если подразумевается только одно, перепишите требование так, чтобы оно стало явным; если верны несколько, возможно, нужны отдельные требования.
Там, где недопонимание недопустимо, переходите к формальным методам: псевдокоду, конечным автоматам или таблицам решений.
Рекомендации авторов#
- Используйте естественный язык везде, где можно.
- Добавляйте рисунки и диаграммы.
- Спрашивайте, когда сомневаетесь, — и спрашивайте, даже когда сомнений нет.
- Применяйте формальные методы там, где неверное прочтение недопустимо.
- Учите команду распознавать неоднозначность, а не только исправлять отдельные случаи.
Как применять#
- Оцените риск. Для каждой области требований спросите, насколько плохим будет неверное прочтение (досадным, дорогим, опасным) и насколько хорошо исполнители знают предметную область.
- Задайте степень детализации. Высокий риск и исполнители, для которых предметная область нова, требуют максимума деталей, моделей или формальных методов. При низком риске и опытных исполнителях, которые легко могут задать вопрос, хватит коротких формулировок и разговора.
- Выберите рискованные пункты и проверьте их эвристикой ударения на коротком ревью.
- Проведите проверку запоминанием для самых важных пунктов — с одним представителем бизнеса и одним разработчиком.
- Проведите проверку ключевых слов для терминов, которые встречаются во многих требованиях, и внесите согласованные значения в глоссарий.
- Повышайте формальность там, где неоднозначность остаётся: переходите к диаграмме, таблице решений или прототипу.
Пример#
У «Мастерской», вымышленной сети веломастерских, есть требование: «Уведомить клиента, когда велосипед готов». Чтение с ударением выявляет:
- Уведомить — по 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» и эвристик запоминания, ключевых слов и ударения.