Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 759
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
458
ЧАСТЬ V Усовершенствование кода
쐽
Понятность — легкость понимания системы и на уровне общей организации,
и на детальном уровне отдельных операторов. Понятность характеризует со- гласованность системы на более общем уровне, чем удобочитаемость.
Как и внешние, некоторые из этих внутренних характеристик качества перекры- ваются, но при этом каждая из них имеет важные отличительные черты.
Внутренние характеристики качества ПО — главная тема этой книги, и в этой главе мы их подробнее рассматривать не будем.
Различие между внутренними и внешними характеристиками качества размыто,
потому что на некотором уровне первые влияют на вторые. Если программа не- достаточно понятна или неудобна в сопровождении, в ней трудно исправлять де- фекты, что в свою очередь влияет на такие внешние характеристики, как коррек- тность и надежность. ПО, страдающее от недостатка гибкости, нельзя улучшить в ответ на запросы пользователей, что сказывается на его практичности. Суть ска- занного в том, что одни характеристики качества облегчают жизнь пользовате- лям, а другие — программистам. Вам следует знать, какие из них какие, и пони- мать, когда и как эти характеристики взаимодействуют.
Рис. 20-1. Концентрация на одной внешней характеристике качества ПО может
влиять на другую характеристику положительно, отрицательно, а может и не влиять
Улучшение некоторых аспектов качества неизбежно приводит к ухудшению дру- гих. Необходимость согласования решения с рядом противоречащих целей дела- ет разработку ПО поистине инженерной дисциплиной. Взаимосвязь внешних характеристик качества пояснена на рис. 20-1. Подобные отношения имеют мес- то и между внутренними характеристиками.
Самый интересный аспект этой диаграммы в том, что концентрация на одной конкретной характеристике не всегда предполагает компромисс с другой харак- теристикой. Одни характеристики связаны между собой обратным отношением,
другие — прямым, а третьи вообще не зависят друг от друга. Так, корректность характеризует степень, в которой работа системы соответствует спецификации.
ГЛАВА 20 Качество ПО
459
Живучесть характеризует способность системы продолжать работу даже в непред- виденных условиях. Стремление повысить корректность приводит к снижению живучести и наоборот. В то же время концентрация на адаптируемости повыша- ет живучесть и наоборот.
Диаграмма, показанная на рис. 20.1 иллюстрирует только типичные отношения между характеристиками качества. В конкретном проекте две характеристики могут быть связаны и нетипичным отношением. Поэтому при размышлении о качестве полезно думать о конкретных целевых характеристиках и о том, способствует одна из них достижению другой или препятствует.
20.2. Методики повышения качества ПО
Контроль качества ПО — это планомерная и систематичная программа действий,
призванная гарантировать, что система обладает желательными характеристика- ми. Вероятно, самый лучший способ разработки высококачественного приложе- ния — сосредоточиться на самом приложении, однако при контроле качества нужно также концентрироваться на процессе разработки.
Целевые характеристики качества ПО Одной из эффективных методик по- вышения качества ПО является явное определение целевых внешних и внутрен- них характеристик. Не имея явных целей, программисты могут сосредоточиться не на тех характеристиках качества, на которых следовало бы.
Явный контроль качества Одна распространенная проблема, связанная с кон- тролем качества, заключается в том, что качество воспринимается как вторичная цель. В некоторых организациях быстрое и «грязное» программирование является скорее правилом, чем исключением. Программисты вроде Глобального Гарри, ко- торые быстро «завершают» работу над программами, наполняя при этом их дефек- тами, получают большее вознаграждение, чем такие программисты, как Высокока- чественный Генри, которые пишут прекрасные программы, убеждаясь в их прак- тичности. Не следует удивляться тому, что в подобных организациях программис- ты не считают качество главным приоритетом. Руководители должны показать про- граммистам, что качество — одна из важнейших целей. Явный контроль качества делает это очевидным, и программисты отвечают соответствующим образом.
Стратегия тестирования Тестирование программы может предоставить детальную оценку ее надежности. Частью контроля качества является разработка стратегии тестирова- ния, учитывающей требования к системе, ее архитектуру и проект. Довольно часто разработчики рассматривают тестирование как главный метод и оценки, и повыше- ния качества. В оставшейся части главы будет показано, что это слишком объемная задача, чтобы ее можно было выполнить исключительно путем тестирования.
Принципы разработки ПО Технический характер ПО во время его разработки должен контролироваться рядом прин- ципов. Такие принципы используются на всех этапах раз- работки ПО, включая определение проблемы, выработку тре- бований, конструирование и тестирование системы. Прин- ципы разработки ПО, описываемые в этой книге, в некотором смысле являются принципами конструирования.
Перекрестная ссылка О тести- ровании см. главу 22.
Перекрестная ссылка Один класс принципов разработки ПО,
актуальных для конструирова- ния, обсуждается в разделе 4.2.
460
ЧАСТЬ V Усовершенствование кода
Неформальные технические обзоры Многие разработчики сами выполняют обзор своей работы до проведения формального обзора. Неформальный обзор может выражаться в самостоятельной проверке проекта или кода, а также в ана- лизе кода вместе с коллегами.
Формальные технические обзоры Важный аспект уп- равления процессом разработки ПО — исправление проблем на этапе «наименьших затрат», т. е. когда на разработку си- стемы потрачен минимальный объем средств и когда решение проблемы окажется наиболее дешевым. Для достижения этой цели служат «ворота качества» — пери- одические тесты или обзоры, позволяющие определить, достаточным ли качеством обладает система на конкретном этапе разработки, чтобы перейти к следующему этапу. Ворота качества обычно используются при переходе от определения тре- бований к разработке архитектуры, от разработки архитектуры к конструирова- нию, а также от конструирования к тестированию системы. «Воротами» может быть инспекция, обзор системы, выполняемый коллегами или заказчиками, а также аудит.
«Ворота качества» не предполагают, что этапы выработки требований или разработки архитектуры нужно выполнить на 100%; они позволяют определить, достаточно ли хоро- ши требования или архитектура, чтобы разработчики мог- ли перейти к следующим этапам. В одних случаях «ворота качества» могут требо- вать определения только самых важных аспектов архитектуры, а в других — оп- ределения почти всех деталей. Разумеется, это зависит от природы конкретного проекта.
Внешний аудит Внешний аудит — это отдельный тип технического обзора, слу- жащий для определения статуса проекта или качества разрабатываемой системы.
Аудит выполняют специалисты другой организации, которые сообщают резуль- таты своей работы тому, кто оплачивает аудит, обычно руководителям.
Процесс разработки
Каждый из упомянутых элементов явно связан с контролем качества и неявно — с процессом разработки ПО. Методи- ки разработки, включающие действия, направленные на контроль качества, способствуют созданию более качествен- ного ПО. Другие процессы, не являющиеся сами по себе аспектами контроля качества, также влияют на качество ПО.
Процедуры контроля изменений Повышению качества
ПО часто препятствуют неконтролируемые изменения. Не- контролируемые изменения требований могут снижать эф- фективность проектирования и кодирования. Неконтролируемые изменения про- екта могут приводить к несоответствию кода и требований, несогласованности отдельных фрагментов кода и лишней трате времени на вынужденное изменение кода. Неконтролируемые изменения самого кода могут приводить к появлению в нем внутренних противоречий и затрудняют слежение за тем, какой код был под-
Перекрестная ссылка О зависи- мости подходов к разработке ПО
от типа проекта см. раздел 3.2.
Дополнительные сведения Разра- ботка ПО как процесс обсужда- ется в книге «Professional Software
Development» (McConnell, 1994).
Перекрестная ссылка О контро- ле изменений см. раздел 28.2.
Перекрестная ссылка Об обзо- рах и инспекциях см. главу 21.
ГЛАВА 20 Качество ПО
461
вергнут полному обзору и тестированию, а какой — нет. Изменения естественным образом вызывают дестабилизацию системы и снижение ее качества, поэтому эф- фективный контроль изменений — важнейшее условие достижения высокого ка- чества ПО.
Оценка результатов Только оценив результаты выполнения плана контроля качества, вы сможете узнать, эффективен ли он. Оценка позволяет не только уз- нать эффективность плана, но и изменить процесс разработки контролируемым образом с целью его улучшения. Кроме того, вы можете извлечь дополнительную выгоду, оценивая сами атрибуты качества: корректность, практичность, эффектив- ность и т. д. Обсуждение оценки атрибутов качества см. в главе 9 книги «Principles of Software Engineering» (Gilb, 1988).
Прототипирование Прототипированием называют разработку реа- листичных моделей важных функций системы. Так, разработчики могут использовать прототипирование для определения удобства пользователь- ского интерфейса, времени выполнения важных вычислений или объема памя- ти, нужного для хранения типичных наборов данных. Анализ 16 опубликованных и 8 неопубликованных исследований конкретных случаев, посвященный сравне- нию прототипирования с традиционными методиками разработки, основанны- ми на спецификациях, показал, что прототипирование повышает эффективность проектирования, способствует более полному удовлетворению потребностей пользователей и облегчает сопровождение ПО (Gordon and Bieman, 1991).
Задание целей
Явное задание целевых аспектов качества — простой и очевидный способ повы- шения качества ПО, но его легко упустить. Будут ли программисты на самом деле преследовать явные заданные цели? Да, будут, если цели будут им известны и если цели будут разумны. Программисты не могут стремиться к достижению постоян- но изменяющихся или недостижимых .
Джеральд Вайнберг и Эдвард Шульман провели один очень интересный экспери- мент, посвященный изучению влияния задания целевых аспектов качества на производительность труда программистов (Weinberg and Schulman, 1974). Они попросили пять групп разработчиков написать одну и ту же программу и указали одни и те же пять целевых характеристик качества, но каждой группе было ска- зано оптимизировать разные характеристики: одной — минимизировать объем используемой программой памяти, второй — обратить максимальное внимание на ясность выводимых данных, третьей — создать как можно более удобочитае- мый код, четвертой — сделать программу максимально компактной, а пятой —
написать программу за минимальное время. В табл. 20-1 показано, какое место заняла каждая группа по каждому целевому показателю.
462
ЧАСТЬ V Усовершенствование кода
Табл. 20-1. Места, занятые каждой группой по каждому целевому показателю
Целевая характеристика
качества, на которую
Читабель-
группа должна была
Минималь- ность выво- Читабель-
Минималь-
обратить максимальное ный объем димых
ность
Компакт-
ное время
внимание
памяти
данных
кода
ность кода разработки
Минимальный объем
1 4
4 2
5
памяти
Читабельность
5 1
1 5
3
выводимых данных
Читабельность кода
3 2
2 3
4
Компактность кода
2 5
3 1
3
Минимальное время
4 3
5 4
1
разработки
Источник: «Goals and Performance in Computer Programming»
(Weinberg and Schulman, 1974).
Результаты впечатляют: четыре из пяти групп выполнили поставленные перед ними задачи лучше всех остальных групп. Оставшаяся группа за- няла в своей категории второе место. Никакой группе не удалось преус- петь в достижении всех целей.
Что из этого следует? То, что люди на самом деле делают то, о чем вы их просите.
Программисты действительно стремятся к достижению поставленных целей, но они должны знать, что это за цели. И еще одно следствие: как и ожидалось, целе- вые характеристики качества конфликтуют, поэтому преуспеть в достижении всех целей почти невозможно.
20.3. Относительная эффективность
методик контроля качества ПО
Не все методики контроля качества имеют одинаковую эффективность. Эффек- тивность многих методик в плане нахождения и устранения дефектов уже извес- тна. В данном разделе мы обсудим этот и некоторые другие аспекты «эффектив- ности» методик контроля качества.
Эффективность обнаружения дефектов
Некоторые методики более эффективны в обнаружении дефектов, чем другие, к тому же разные методики приводят к обнаружению разных дефектов. Одним из способов оценки методик нахождения дефектов является определение про- цента обнаруженных дефектов из общего числа дефектов,
имеющихся в программе на конкретном этапе. Показатели эффективности нахождения дефектов при использовании некоторых популярных методик указаны в табл. 20-2.
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы цивилизацию.
Джеральд Вайнберг
(Gerald Weinberg)
1 ... 52 53 54 55 56 57 58 59 ... 104
ГЛАВА 20 Качество ПО
463
Табл. 20-2. Эффективность нахождения дефектов
при использовании разных методик
Методика
Минимальная
Типичная
Максимальная
устранения дефектов
эффективность
эффективность
эффективность
Неформальные
25%
35%
40%
обзоры проекта
Формальные
45%
55%
65%
инспекции проекта
Неформальные
20%
25%
35%
обзоры кода
Формальные
45%
60%
70%
инспекции кода
Моделирование
35%
65%
80%
или прототипирование
Самостоятельная
20%
40%
60%
проверка кода
Блочное тестирование
15%
30%
50%
Тестирование новых
20%
30%
35%
функций (компонентов)
Интеграционное
25%
35%
40%
тестирование
Регрессивное
15%
25%
30%
тестирование
Тестирование системы
25%
40%
55%
Ограниченное бета-тес- 25%
35%
40%
тирование (менее чем в 10 организациях)
Крупномасштабное бета- 60%
75%
85%
тестирование (более чем в 1000 организаций)
Источники: «Programming Productivity» (Jones, 1986a), «Software Defect-Removal
Efficiency» (Jones, 1996) и «What We Have Learned About Fighting Defects» (Shull et al., 2002).
Самое интересное в этих данных то, что типичная эффективность об- наружения дефектов при использовании любой методики не превышает
75% и что в среднем она равна примерно 40%. Более того, самые попу- лярные методики — блочное тестирование и интеграционное тестирование — по- зволяют найти обычно только около 30–35% дефектов. Как правило, использует- ся подход, основанный на интенсивном тестировании, что позволяет устранить лишь около 85% дефектов. Ведущие организации используют более широкий ди- апазон методик, достигая при этом 95%-ой или более высокой эффективности ус- транения дефектов (Jones, 2000).
Итак, если разработчики хотят достигнуть более высокой эффективности обна- ружения дефектов, они должны полагаться на комбинацию методик. Одно из подтверждений этого вывода было получено в классическом исследовании Глен- форда Майерса (Myers, 1978b). Участниками исследования были программисты,
обладавшие минимум 7-, а в среднем — 11-летним опытом. Исследуемая программа
464
ЧАСТЬ V Усовершенствование кода содержала 15 известных ошибок. Майерс попросил каждого программиста най- ти эти ошибки, используя одну из следующих методик:
쐽
тестирование выполнения программы по спецификации;
쐽
тестирование выполнения программы по спецификации с возможностью изу- чения исходного кода;
쐽
анализ/инспекция с использованием и спецификации, и исходного кода.
Различия эффективности обнаружения дефектов оказались очень боль- шими: программисты нашли от 1 до 9 дефектов. Средний показатель был равен 5,1, или 1/3 от общего числа известных дефектов.
При использовании одной методики никакая из них не имела статистически зна- чимого преимущества над любой другой. В то же время любая комбинация двух методик — в том числе использование одной методики двумя независимыми груп- пами — приводила к увеличению общего числа найденных дефектов почти вдвое.
В исследованиях, проведенных в Лаборатории проектирования ПО NASA, компа- нии Boeing и других компаниях, было обнаружено, что разные программисты находят разные дефекты. Только примерно каждую пятую ошибку, обнаруженную в ходе инспекций, находят двое или более разработчиков (Kouchakdjian, Green,
and Basili, 1989; Tripp, Struck, and Pflug, 1991; Schneider, Martin, and Tsai, 1992).
Майерс обращает внимание на то, что поиск одних видов ошибок оказывается более эффективным при непосредственном участии людей (например, при инспекции или анализе кода), а других видов — при компьютерном тестировании (Myers, 1979).
Этот вывод подтвердился в более позднем исследовании, показавшем, что чтение кода способствует нахождению дефектов интерфейса, а функциональное тести- рование — нахождению дефектов управляющих структур (Basili, Selby, and Hutchens,
1986). Гуру тестирования Борис Бейзер (Boris Beizer) сообщает, что неформаль- ные подходы к тестированию обычно позволяют достигнуть покрытия кода тес- тами лишь на 50–60%, если только вы не используете анализатор покрытия
(Johnson, 1994).
Таким образом, методики поиска дефектов лучше применять в комбина- ции. Джонс (Jones) также подтверждает этот вывод. Используя исключи- тельно тестирование, высоких результатов добиться невозможно. Джонс сообщает, что комбинация блочного тестирования, функционального тестирования и тестирования системы часто приводит к обнаружению менее 60% дефектов, что обычно неприемлемо для конечного продукта.
Эти данные также помогают понять, почему программисты, начинающие приме- нять дисциплинированную методику устранения дефектов, такую как экстремаль- ное программирование, добиваются более высокой степени устранения дефектов.
Как показывает табл. 20-3, набор методик устранения дефектов, применяемых в экстремальном программировании, позволяет устранить около 90% дефектов в обычной ситуации и 97% в лучшем случае, что гораздо выше среднего для отрас- ли показателя, равного 85%. Некоторые программисты связывают этот факт с синергичными отношениями между методиками экстремального программиро- вания, но на самом деле это просто предсказуемый результат использования кон- кретного набора методик устранения дефектов. Эффективность других комбинаций методик может оказаться такой же или даже более высокой, поэтому выбор кон-
ГЛАВА 20 Качество ПО
465
кретных методик устранения дефектов, позволяющих достичь желаемого уровня качества, является одним из аспектов эффективного планирования проекта.
Табл. 20-3. Эффективность обнаружения дефектов, характерная
для экстремального программирования
Методика устранения
Минимальная
Типичная
Максимальная
дефектов
эффективность
эффективность
эффективность
Неформальные обзоры
25%
35%
40%
проекта (парное программи- рование)
Неформальные обзоры кода
20%
25%
35%
(парное программирование)
Самостоятельная
20%
40%
60%
проверка кода
Блочное тестирование
15%
30%
50%
Интеграционное
25%
35%
40%
тестирование
Регрессивное тестирование
15%
25%
30%
Общая эффективность
74%
90%
97%
устранения дефектов
Стоимость нахождения дефектов
Некоторые методики обнаружения дефектов дороже других. Наиболее экономич- ные при прочих равных условиях имеют наименьшую стоимость в расчете на один обнаруженный дефект. Равенством прочих условий пренебрегать нельзя, поскольку стоимость методики в расчете на один дефект зависит от общего числа обнару- женных дефектов, этапа обнаружения каждого дефекта и других факторов, не связанных с экономическими аспектами конкретной методики.
Как правило, эксперименты показывают, что инспекции обходятся дешев- ле, чем тестирование. В исследовании, проведенном в Лаборатории про- ектирования ПО, было обнаружено, что при чтении кода число дефек- тов, находимых в час, было примерно на 80% более высоким, чем при тестирова- нии (Basili and Selby, 1987). В другой организации поиск дефектов проектирова- ния с использованием блочного тестирования был вшестеро дороже, чем при ис- пользовании инспекций (Ackerman, Buchwald, and Lewski, 1989). Более позднее ис- следование, проведенное в IBM, показало, что на обнаружение каждой ошибки раз- работчики тратили 3,5 человеко-часа в случае инспекций кода и 15–25 в случае тестирования (Kaplan, 1995).
Стоимость исправления дефектов
Стоимость нахождения дефектов — только одна часть уравнения. Другой частью является стоимость их исправления. На первый взгляд, методика обнаружения дефектов не играет роли: стоимость их исправления всегда будет одинаковой.
Это неверно, потому что чем дольше дефект остается в системе, тем больше средств придется потратить на его устранение. Следовательно, методика, способствующая раннему обнаружению ошибок, снижает стоимость их исправления. Еще важнее
466
ЧАСТЬ V Усовершенствование кода то, что одни методики — такие как инспекции — позволя- ют определить и симптомы, и причины дефектов за один этап; другие — например, тестирование — указывают на симптомы дефекта, но требуют выполнения дополнитель- ной работы для диагностики и устранения его причины. В
итоге одноэтапные методики оказываются гораздо более дешевыми, чем двухэтапные.
В одном из подразделений Microsoft обнаружили, что при использова- нии инспекции кода — одноэтапной методики — на нахождение и ис- правление дефекта уходит 3 часа, тогда как при использовании тестиро- вания — двухэтапной методики — на это требуется 12 часов (Moore, 1992). Кол- лофелло и Вудфилд сообщили, что при разработке программы из 700 000 строк,
над которой работало более 400 программистов, обзоры кода имели гораздо бо- лее высокую экономическую эффективность, чем тестирование: прибыль на ин- вестированный капитал была равной 1,38 и 0,17 соответственно (Collofello and
Woodfield, 1989).
Суть сказанного в том, что эффективная программа контроля качества должна включать комбинацию методик, применяемых на всех стадиях разработки. Для достижения высокого качества ПО можно использовать следующую комбинацию:
쐽
формальные инспекции всех требований, всех аспектов архитектуры и всех проектов критических частей системы;
쐽
моделирование или прототипирование;
쐽
чтение или инспекции кода;
쐽
тестирование выполнения программы.
20.4. Когда выполнять контроль качества ПО?
Как было отмечено в главе 3, чем раньше ошибка внедряет- ся в приложение, тем сильнее она переплетается с другими частями приложения и тем больше средств придется потра- тить на ее устранение. Дефект в требованиях может вылить- ся в один или несколько дефектов в проекте, которые могут привести к появлению множества дефектов в коде. Ошибка в требованиях может привести к разработке дополнительных компонентов архитектуры или подтолкнуть к неудачным ар- хитектурным решениям. Дополнительные архитектурные компоненты требуют написания дополнительного кода, те- стов и документации. С другой стороны, ошибка в требованиях может привести к выбрасыванию частей архитектуры, кода и тестов. Если идея устранения ошибок из чертежей дома перед заливкой фундамента бетоном кажется вам разумной, то вы согласитесь и с тем, что дефекты требований и архитектуры также следует уст- ранять до того, как они повлияют на более поздние этапы разработки.
Кроме того, ошибки в требованиях или архитектуре обычно имеют более широ- кие следствия, чем ошибки конструирования. Одна ошибка в архитектуре может затронуть несколько классов и десятки методов, тогда как одна ошибка констру-
Перекрестная ссылка О зависи- мости стоимости исправления дефектов от срока их присут- ствия в системе см. раздел «Об- ращение к данным» раздела 3.1.
Сами ошибки более подробно обсуждаются в разделе 22.4.
Перекрестная ссылка Контроль качества предварительных дей- ствий — например, определения требований и разработки архи- тектуры — в этой книге не рас- сматривается. Информацию по этим темам можно найти в кни- гах, указанных в разделе «До- полнительные ресурсы» в кон- це этой главы.
ГЛАВА 20 Качество ПО
467
ирования скорее всего повлияет только на один метод или класс. Это еще одно убедительное обоснование как можно более раннего нахождения ошибок.
Дефекты проникают в ПО на всех стадиях разработки, поэтому контро- лю качества следует уделять должное внимание на всех этапах проекта,
начиная с самых ранних. Контроль качества нужно внести в планы в начале работы над программой; его следует выполнять по мере прогресса; нако- нец, он должен подчеркивать удачное завершение работы над проектом.
20.5. Главный Закон Контроля Качества ПО
Ни в одном ресторане посетителей не кормят бесплатно, и даже если б кормили, никто не смог бы поручиться за качество блюд. Однако разра- ботка ПО — совсем не кулинарное искусство, и качество ПО имеет одну важную необычную особенность. Главный Закон Контроля Качества ПО заключа- ется в том, что повышение качества системы снижает расходы на ее разработку.
В основе этого закона лежит одно важное наблюдение: лучшим способом повы- шения производительности труда программистов и качества ПО является мини- мизация времени, затрачиваемого на исправление кода, чем бы оно ни объясня- лось: изменениями требований, изменениями проекта или отладкой. Средняя для отрасли производительность труда программистов эквивалентна примерно 10–
50 строкам кода на одного человека в день (с учетом всех затрат, не связанных с кодированием). Написание 10–50 строк кода требует нескольких минут, — на что же уходит остальное время?
Такая, казалось бы, низкая производительность труда час- тично объясняется тем, что в подобных средних показате- лях учитывается время, не связанное непосредственно с программированием. Время тестировщиков, руководителей,
секретарей — все эти факторы включены в данный показа- тель. Определение требований, разработка архитектуры и другие действия, не относящиеся к кодированию, также отра- жены в «строках кода в день». Однако основные временные затраты объясняются не этим.
Самый длительный этап в большинстве проектов — отладка и исправление не- правильного кода. При традиционном цикле разработки ПО эти действия зани- мают около 50% времени (см. раздел 3.1). Сокращение потребности в отладке,
достигаемое благодаря предотвращению ошибок, повышает производительность труда. Следовательно, наиболее очевидный метод сокращения графика разработ- ки — повышение качества ПО и снижение объема времени, уходящего на его отладку и исправление.
Этот анализ подтверждается реальными данными. В обзоре 50 проектов,
потребовавших более 400 человеколет и включивших почти 3 000 000
строк кода, проведенном в Лаборатории проектирования ПО NASA, было обнаружено, что повышенное внимание к контролю качества позволяло снизить уровень ошибок, но не повышало общие расходы на разработку (Card, 1987).
Перекрестная ссылка О разли- чиях между написанием отдель- ной программы и созданием программного продукта см. под- раздел «Программы, продукты,
системы и системные продукты»
раздела 27.5.
468
ЧАСТЬ V Усовершенствование кода
В исследовании, проведенном в IBM, были получены аналогичные результаты:
Программным проектам с наименьшими уровнями дефектов соответствовали самые короткие графики разработки и максимальные показатели производитель- ности труда… устранение дефектов на самом деле — самый дорогой и длитель- ный этап разработки ПО (Jones, 2000).
Это верно и для противоположного края шкалы. В одном исследовании
1985 года ученые попросили 166 профессиональных программистов написать программы по одной и той же спецификации. Итоговые про- граммы содержали в среднем 220 строк, а на их написание ушло в среднем чуть меньше 5 часов. Результаты оказались поистине удивительными: программисты,
работавшие над своими программами средний объем времени, допустили наиболь- шее число ошибок. Программисты, которым потребовалось больше или меньше времени, допустили значительно меньше ошибок (DeMarco and Lister, 1985). Ре- зультаты показаны на рисунке 20-2.
Рис. 20-2. Ни при самом быстром, ни при самом медленном подходе к разработке
ПО не наблюдается наибольший уровень дефектов
В сравнении с самой быстрой группой двум самым медленным группам понадо- билось примерно в 5 раз больше времени для достижения результата с примерно тем же уровнем дефектов. Таким образом, на создание ПО без дефектов не всегда уходит больше времени, чем на написание ПО с дефектами.
Вероятно, в некоторых случаях контроль качества требует значительных затрат.
Если вы пишете приложение управления космическим кораблем или медицин- ской системой жизнеобеспечения, высокие требования к надежности ПО делают проект более дорогим.
В сравнении с традиционным циклом «кодирование — тестирование — отладка»
улучшенная программа контроля качества ПО оказывается более экономичной.
Она перенаправляет ресурсы от отладки и рефакторинга к предварительным этапам контроля качества. Предварительные этапы влияют на качество системы больше,
чем последующие, поэтому время, потраченное на предварительных этапах, по- зволяет сэкономить больше времени потом. Результатом является снижение уровня
ГЛАВА 20 Качество ПО
469
дефектов, сокращение сроков разработки и снижение затрат. В трех следующих главах вы найдете еще несколько примеров, иллюстрирующих Главный Закон
Контроля Качества ПО.
Контрольный список: план контроля качества
Идентифицировали ли вы специфические характеристики качества, имеющие особую важность в вашем проекте?
Сообщили ли вы другим программистам целевые характеристики качества?
Провели ли вы различие между внешними и внутренними характеристика- ми качества?
Обдумали ли вы, как некоторые характеристики могут усиливать или ос- лаблять другие?
Призывает ли ваш проект к использованию нескольких методик обнаруже- ния ошибок, ориентированных на поиск разных видов ошибок?
Составили ли вы план контроля качества, охватывающий все этапы разра- ботки ПО?
Оцениваете ли вы качество системы каким-нибудь образом, чтобы можно было определить, повышается оно или понижается?
Понимают ли руководители, что контроль качества требует дополнительных расходов в начале проекта, но зато позволяет добиться общей экономии средств?
Дополнительные ресурсы
Составить список книг для этой главы несложно, потому что методики повышения качества ПО и производительности труда описываются почти во всех трудах, посвященных эф- фективным методологиям разработки ПО. Сложность в том, чтобы выделить книги,
касающиеся непосредственно качества ПО. Ниже я указал две такие работы.
Ginac, Frank P.
Customer Oriented Software Quality Assurance. Englewood Cliffs, NJ: Prentice
Hall, 1998. В этой очень краткой книге описаны атрибуты качества, метрики каче- ства, программы контроля качества, роль тестирования в контроле качества, а так- же известные программы повышения качества, в том числе модель CMM, разрабо- танная в институте Software Engineering Institute, и стандарты ISO серии 9000.
Lewis, William E.
Software Testing and Continuous Quality Improvement, 2d ed. Auer- bach Publishing, 2000. В этой книге можно найти подробное обсуждение цикла контроля качества, а также методик тестирования. Кроме того, в ней вы найдете много контрольных форм и списков.
Соответствующие стандарты
IEEE Std 730-2002 — стандарт IEEE планирования контроля качества ПО.
IEEE Std 1061-1998 — стандарт IEEE методологии метрик качества ПО.
IEEE Std 1028-1997 — стандарт обзоров ПО.
http://cc2e.com/2043
http://cc2e.com/2050
http://cc2e.com/2057
470
ЧАСТЬ V Усовершенствование кода
IEEE Std 1008-1987 (R1993) — стандарт блочного тестирования ПО.
IEEE Std 829-1998 — стандарт документирования тестов ПО.
Ключевые моменты
쐽
Высокого качества можно достичь без дополнительных затрат, но для этого вы должны перераспределить ресурсы и предотвращать дефекты вместо того,
чтобы их исправлять.
쐽
Стремление к одним характеристикам качества препятствует достижению дру- гих. Четко определите цели, имеющие для вас первостепенную важность, и сообщите об этом всем членам группы.
쐽
Никакая методика обнаружения дефектов не является достаточно эффектив- ной. Тестирование само по себе — не самый лучший способ устранения оши- бок. Составляя программу контроля качества, предусмотрите применение не- скольких методик, позволяющих обнаружить разные виды ошибок.
쐽
Существуют многие эффективные методики контроля качества, применяемые как во время конструирования, так и до его начала. Чем раньше вы обнаружи- те дефект, тем слабее он переплетется с остальным кодом и тем меньше вреда он успеет принести.
쐽
В мире программирования контроль качества ориентирован на процесс.
В отличие от промышленного производства разработка ПО не включает по- вторяющегося этапа, влияющего на конечный продукт, поэтому качество ре- зультата определяется процессом, используемым для разработки ПО.
1 ... 53 54 55 56 57 58 59 60 ... 104
ГЛАВА 20 Качество ПО
463
Табл. 20-2. Эффективность нахождения дефектов
при использовании разных методик
Методика
Минимальная
Типичная
Максимальная
устранения дефектов
эффективность
эффективность
эффективность
Неформальные
25%
35%
40%
обзоры проекта
Формальные
45%
55%
65%
инспекции проекта
Неформальные
20%
25%
35%
обзоры кода
Формальные
45%
60%
70%
инспекции кода
Моделирование
35%
65%
80%
или прототипирование
Самостоятельная
20%
40%
60%
проверка кода
Блочное тестирование
15%
30%
50%
Тестирование новых
20%
30%
35%
функций (компонентов)
Интеграционное
25%
35%
40%
тестирование
Регрессивное
15%
25%
30%
тестирование
Тестирование системы
25%
40%
55%
Ограниченное бета-тес- 25%
35%
40%
тирование (менее чем в 10 организациях)
Крупномасштабное бета- 60%
75%
85%
тестирование (более чем в 1000 организаций)
Источники: «Programming Productivity» (Jones, 1986a), «Software Defect-Removal
Efficiency» (Jones, 1996) и «What We Have Learned About Fighting Defects» (Shull et al., 2002).
Самое интересное в этих данных то, что типичная эффективность об- наружения дефектов при использовании любой методики не превышает
75% и что в среднем она равна примерно 40%. Более того, самые попу- лярные методики — блочное тестирование и интеграционное тестирование — по- зволяют найти обычно только около 30–35% дефектов. Как правило, использует- ся подход, основанный на интенсивном тестировании, что позволяет устранить лишь около 85% дефектов. Ведущие организации используют более широкий ди- апазон методик, достигая при этом 95%-ой или более высокой эффективности ус- транения дефектов (Jones, 2000).
Итак, если разработчики хотят достигнуть более высокой эффективности обна- ружения дефектов, они должны полагаться на комбинацию методик. Одно из подтверждений этого вывода было получено в классическом исследовании Глен- форда Майерса (Myers, 1978b). Участниками исследования были программисты,
обладавшие минимум 7-, а в среднем — 11-летним опытом. Исследуемая программа
464
ЧАСТЬ V Усовершенствование кода содержала 15 известных ошибок. Майерс попросил каждого программиста най- ти эти ошибки, используя одну из следующих методик:
쐽
тестирование выполнения программы по спецификации;
쐽
тестирование выполнения программы по спецификации с возможностью изу- чения исходного кода;
쐽
анализ/инспекция с использованием и спецификации, и исходного кода.
Различия эффективности обнаружения дефектов оказались очень боль- шими: программисты нашли от 1 до 9 дефектов. Средний показатель был равен 5,1, или 1/3 от общего числа известных дефектов.
При использовании одной методики никакая из них не имела статистически зна- чимого преимущества над любой другой. В то же время любая комбинация двух методик — в том числе использование одной методики двумя независимыми груп- пами — приводила к увеличению общего числа найденных дефектов почти вдвое.
В исследованиях, проведенных в Лаборатории проектирования ПО NASA, компа- нии Boeing и других компаниях, было обнаружено, что разные программисты находят разные дефекты. Только примерно каждую пятую ошибку, обнаруженную в ходе инспекций, находят двое или более разработчиков (Kouchakdjian, Green,
and Basili, 1989; Tripp, Struck, and Pflug, 1991; Schneider, Martin, and Tsai, 1992).
Майерс обращает внимание на то, что поиск одних видов ошибок оказывается более эффективным при непосредственном участии людей (например, при инспекции или анализе кода), а других видов — при компьютерном тестировании (Myers, 1979).
Этот вывод подтвердился в более позднем исследовании, показавшем, что чтение кода способствует нахождению дефектов интерфейса, а функциональное тести- рование — нахождению дефектов управляющих структур (Basili, Selby, and Hutchens,
1986). Гуру тестирования Борис Бейзер (Boris Beizer) сообщает, что неформаль- ные подходы к тестированию обычно позволяют достигнуть покрытия кода тес- тами лишь на 50–60%, если только вы не используете анализатор покрытия
(Johnson, 1994).
Таким образом, методики поиска дефектов лучше применять в комбина- ции. Джонс (Jones) также подтверждает этот вывод. Используя исключи- тельно тестирование, высоких результатов добиться невозможно. Джонс сообщает, что комбинация блочного тестирования, функционального тестирования и тестирования системы часто приводит к обнаружению менее 60% дефектов, что обычно неприемлемо для конечного продукта.
Эти данные также помогают понять, почему программисты, начинающие приме- нять дисциплинированную методику устранения дефектов, такую как экстремаль- ное программирование, добиваются более высокой степени устранения дефектов.
Как показывает табл. 20-3, набор методик устранения дефектов, применяемых в экстремальном программировании, позволяет устранить около 90% дефектов в обычной ситуации и 97% в лучшем случае, что гораздо выше среднего для отрас- ли показателя, равного 85%. Некоторые программисты связывают этот факт с синергичными отношениями между методиками экстремального программиро- вания, но на самом деле это просто предсказуемый результат использования кон- кретного набора методик устранения дефектов. Эффективность других комбинаций методик может оказаться такой же или даже более высокой, поэтому выбор кон-
ГЛАВА 20 Качество ПО
465
кретных методик устранения дефектов, позволяющих достичь желаемого уровня качества, является одним из аспектов эффективного планирования проекта.
Табл. 20-3. Эффективность обнаружения дефектов, характерная
для экстремального программирования
Методика устранения
Минимальная
Типичная
Максимальная
дефектов
эффективность
эффективность
эффективность
Неформальные обзоры
25%
35%
40%
проекта (парное программи- рование)
Неформальные обзоры кода
20%
25%
35%
(парное программирование)
Самостоятельная
20%
40%
60%
проверка кода
Блочное тестирование
15%
30%
50%
Интеграционное
25%
35%
40%
тестирование
Регрессивное тестирование
15%
25%
30%
Общая эффективность
74%
90%
97%
устранения дефектов
Стоимость нахождения дефектов
Некоторые методики обнаружения дефектов дороже других. Наиболее экономич- ные при прочих равных условиях имеют наименьшую стоимость в расчете на один обнаруженный дефект. Равенством прочих условий пренебрегать нельзя, поскольку стоимость методики в расчете на один дефект зависит от общего числа обнару- женных дефектов, этапа обнаружения каждого дефекта и других факторов, не связанных с экономическими аспектами конкретной методики.
Как правило, эксперименты показывают, что инспекции обходятся дешев- ле, чем тестирование. В исследовании, проведенном в Лаборатории про- ектирования ПО, было обнаружено, что при чтении кода число дефек- тов, находимых в час, было примерно на 80% более высоким, чем при тестирова- нии (Basili and Selby, 1987). В другой организации поиск дефектов проектирова- ния с использованием блочного тестирования был вшестеро дороже, чем при ис- пользовании инспекций (Ackerman, Buchwald, and Lewski, 1989). Более позднее ис- следование, проведенное в IBM, показало, что на обнаружение каждой ошибки раз- работчики тратили 3,5 человеко-часа в случае инспекций кода и 15–25 в случае тестирования (Kaplan, 1995).
Стоимость исправления дефектов
Стоимость нахождения дефектов — только одна часть уравнения. Другой частью является стоимость их исправления. На первый взгляд, методика обнаружения дефектов не играет роли: стоимость их исправления всегда будет одинаковой.
Это неверно, потому что чем дольше дефект остается в системе, тем больше средств придется потратить на его устранение. Следовательно, методика, способствующая раннему обнаружению ошибок, снижает стоимость их исправления. Еще важнее
466
ЧАСТЬ V Усовершенствование кода то, что одни методики — такие как инспекции — позволя- ют определить и симптомы, и причины дефектов за один этап; другие — например, тестирование — указывают на симптомы дефекта, но требуют выполнения дополнитель- ной работы для диагностики и устранения его причины. В
итоге одноэтапные методики оказываются гораздо более дешевыми, чем двухэтапные.
В одном из подразделений Microsoft обнаружили, что при использова- нии инспекции кода — одноэтапной методики — на нахождение и ис- правление дефекта уходит 3 часа, тогда как при использовании тестиро- вания — двухэтапной методики — на это требуется 12 часов (Moore, 1992). Кол- лофелло и Вудфилд сообщили, что при разработке программы из 700 000 строк,
над которой работало более 400 программистов, обзоры кода имели гораздо бо- лее высокую экономическую эффективность, чем тестирование: прибыль на ин- вестированный капитал была равной 1,38 и 0,17 соответственно (Collofello and
Woodfield, 1989).
Суть сказанного в том, что эффективная программа контроля качества должна включать комбинацию методик, применяемых на всех стадиях разработки. Для достижения высокого качества ПО можно использовать следующую комбинацию:
쐽
формальные инспекции всех требований, всех аспектов архитектуры и всех проектов критических частей системы;
쐽
моделирование или прототипирование;
쐽
чтение или инспекции кода;
쐽
тестирование выполнения программы.
20.4. Когда выполнять контроль качества ПО?
Как было отмечено в главе 3, чем раньше ошибка внедряет- ся в приложение, тем сильнее она переплетается с другими частями приложения и тем больше средств придется потра- тить на ее устранение. Дефект в требованиях может вылить- ся в один или несколько дефектов в проекте, которые могут привести к появлению множества дефектов в коде. Ошибка в требованиях может привести к разработке дополнительных компонентов архитектуры или подтолкнуть к неудачным ар- хитектурным решениям. Дополнительные архитектурные компоненты требуют написания дополнительного кода, те- стов и документации. С другой стороны, ошибка в требованиях может привести к выбрасыванию частей архитектуры, кода и тестов. Если идея устранения ошибок из чертежей дома перед заливкой фундамента бетоном кажется вам разумной, то вы согласитесь и с тем, что дефекты требований и архитектуры также следует уст- ранять до того, как они повлияют на более поздние этапы разработки.
Кроме того, ошибки в требованиях или архитектуре обычно имеют более широ- кие следствия, чем ошибки конструирования. Одна ошибка в архитектуре может затронуть несколько классов и десятки методов, тогда как одна ошибка констру-
Перекрестная ссылка О зависи- мости стоимости исправления дефектов от срока их присут- ствия в системе см. раздел «Об- ращение к данным» раздела 3.1.
Сами ошибки более подробно обсуждаются в разделе 22.4.
Перекрестная ссылка Контроль качества предварительных дей- ствий — например, определения требований и разработки архи- тектуры — в этой книге не рас- сматривается. Информацию по этим темам можно найти в кни- гах, указанных в разделе «До- полнительные ресурсы» в кон- це этой главы.
ГЛАВА 20 Качество ПО
467
ирования скорее всего повлияет только на один метод или класс. Это еще одно убедительное обоснование как можно более раннего нахождения ошибок.
Дефекты проникают в ПО на всех стадиях разработки, поэтому контро- лю качества следует уделять должное внимание на всех этапах проекта,
начиная с самых ранних. Контроль качества нужно внести в планы в начале работы над программой; его следует выполнять по мере прогресса; нако- нец, он должен подчеркивать удачное завершение работы над проектом.
20.5. Главный Закон Контроля Качества ПО
Ни в одном ресторане посетителей не кормят бесплатно, и даже если б кормили, никто не смог бы поручиться за качество блюд. Однако разра- ботка ПО — совсем не кулинарное искусство, и качество ПО имеет одну важную необычную особенность. Главный Закон Контроля Качества ПО заключа- ется в том, что повышение качества системы снижает расходы на ее разработку.
В основе этого закона лежит одно важное наблюдение: лучшим способом повы- шения производительности труда программистов и качества ПО является мини- мизация времени, затрачиваемого на исправление кода, чем бы оно ни объясня- лось: изменениями требований, изменениями проекта или отладкой. Средняя для отрасли производительность труда программистов эквивалентна примерно 10–
50 строкам кода на одного человека в день (с учетом всех затрат, не связанных с кодированием). Написание 10–50 строк кода требует нескольких минут, — на что же уходит остальное время?
Такая, казалось бы, низкая производительность труда час- тично объясняется тем, что в подобных средних показате- лях учитывается время, не связанное непосредственно с программированием. Время тестировщиков, руководителей,
секретарей — все эти факторы включены в данный показа- тель. Определение требований, разработка архитектуры и другие действия, не относящиеся к кодированию, также отра- жены в «строках кода в день». Однако основные временные затраты объясняются не этим.
Самый длительный этап в большинстве проектов — отладка и исправление не- правильного кода. При традиционном цикле разработки ПО эти действия зани- мают около 50% времени (см. раздел 3.1). Сокращение потребности в отладке,
достигаемое благодаря предотвращению ошибок, повышает производительность труда. Следовательно, наиболее очевидный метод сокращения графика разработ- ки — повышение качества ПО и снижение объема времени, уходящего на его отладку и исправление.
Этот анализ подтверждается реальными данными. В обзоре 50 проектов,
потребовавших более 400 человеколет и включивших почти 3 000 000
строк кода, проведенном в Лаборатории проектирования ПО NASA, было обнаружено, что повышенное внимание к контролю качества позволяло снизить уровень ошибок, но не повышало общие расходы на разработку (Card, 1987).
Перекрестная ссылка О разли- чиях между написанием отдель- ной программы и созданием программного продукта см. под- раздел «Программы, продукты,
системы и системные продукты»
раздела 27.5.
468
ЧАСТЬ V Усовершенствование кода
В исследовании, проведенном в IBM, были получены аналогичные результаты:
Программным проектам с наименьшими уровнями дефектов соответствовали самые короткие графики разработки и максимальные показатели производитель- ности труда… устранение дефектов на самом деле — самый дорогой и длитель- ный этап разработки ПО (Jones, 2000).
Это верно и для противоположного края шкалы. В одном исследовании
1985 года ученые попросили 166 профессиональных программистов написать программы по одной и той же спецификации. Итоговые про- граммы содержали в среднем 220 строк, а на их написание ушло в среднем чуть меньше 5 часов. Результаты оказались поистине удивительными: программисты,
работавшие над своими программами средний объем времени, допустили наиболь- шее число ошибок. Программисты, которым потребовалось больше или меньше времени, допустили значительно меньше ошибок (DeMarco and Lister, 1985). Ре- зультаты показаны на рисунке 20-2.
Рис. 20-2. Ни при самом быстром, ни при самом медленном подходе к разработке
ПО не наблюдается наибольший уровень дефектов
В сравнении с самой быстрой группой двум самым медленным группам понадо- билось примерно в 5 раз больше времени для достижения результата с примерно тем же уровнем дефектов. Таким образом, на создание ПО без дефектов не всегда уходит больше времени, чем на написание ПО с дефектами.
Вероятно, в некоторых случаях контроль качества требует значительных затрат.
Если вы пишете приложение управления космическим кораблем или медицин- ской системой жизнеобеспечения, высокие требования к надежности ПО делают проект более дорогим.
В сравнении с традиционным циклом «кодирование — тестирование — отладка»
улучшенная программа контроля качества ПО оказывается более экономичной.
Она перенаправляет ресурсы от отладки и рефакторинга к предварительным этапам контроля качества. Предварительные этапы влияют на качество системы больше,
чем последующие, поэтому время, потраченное на предварительных этапах, по- зволяет сэкономить больше времени потом. Результатом является снижение уровня
ГЛАВА 20 Качество ПО
469
дефектов, сокращение сроков разработки и снижение затрат. В трех следующих главах вы найдете еще несколько примеров, иллюстрирующих Главный Закон
Контроля Качества ПО.
Контрольный список: план контроля качества
Идентифицировали ли вы специфические характеристики качества, имеющие особую важность в вашем проекте?
Сообщили ли вы другим программистам целевые характеристики качества?
Провели ли вы различие между внешними и внутренними характеристика- ми качества?
Обдумали ли вы, как некоторые характеристики могут усиливать или ос- лаблять другие?
Призывает ли ваш проект к использованию нескольких методик обнаруже- ния ошибок, ориентированных на поиск разных видов ошибок?
Составили ли вы план контроля качества, охватывающий все этапы разра- ботки ПО?
Оцениваете ли вы качество системы каким-нибудь образом, чтобы можно было определить, повышается оно или понижается?
Понимают ли руководители, что контроль качества требует дополнительных расходов в начале проекта, но зато позволяет добиться общей экономии средств?
Дополнительные ресурсы
Составить список книг для этой главы несложно, потому что методики повышения качества ПО и производительности труда описываются почти во всех трудах, посвященных эф- фективным методологиям разработки ПО. Сложность в том, чтобы выделить книги,
касающиеся непосредственно качества ПО. Ниже я указал две такие работы.
Ginac, Frank P.
Customer Oriented Software Quality Assurance. Englewood Cliffs, NJ: Prentice
Hall, 1998. В этой очень краткой книге описаны атрибуты качества, метрики каче- ства, программы контроля качества, роль тестирования в контроле качества, а так- же известные программы повышения качества, в том числе модель CMM, разрабо- танная в институте Software Engineering Institute, и стандарты ISO серии 9000.
Lewis, William E.
Software Testing and Continuous Quality Improvement, 2d ed. Auer- bach Publishing, 2000. В этой книге можно найти подробное обсуждение цикла контроля качества, а также методик тестирования. Кроме того, в ней вы найдете много контрольных форм и списков.
Соответствующие стандарты
IEEE Std 730-2002 — стандарт IEEE планирования контроля качества ПО.
IEEE Std 1061-1998 — стандарт IEEE методологии метрик качества ПО.
IEEE Std 1028-1997 — стандарт обзоров ПО.
http://cc2e.com/2043
http://cc2e.com/2050
http://cc2e.com/2057
470
ЧАСТЬ V Усовершенствование кода
IEEE Std 1008-1987 (R1993) — стандарт блочного тестирования ПО.
IEEE Std 829-1998 — стандарт документирования тестов ПО.
Ключевые моменты
쐽
Высокого качества можно достичь без дополнительных затрат, но для этого вы должны перераспределить ресурсы и предотвращать дефекты вместо того,
чтобы их исправлять.
쐽
Стремление к одним характеристикам качества препятствует достижению дру- гих. Четко определите цели, имеющие для вас первостепенную важность, и сообщите об этом всем членам группы.
쐽
Никакая методика обнаружения дефектов не является достаточно эффектив- ной. Тестирование само по себе — не самый лучший способ устранения оши- бок. Составляя программу контроля качества, предусмотрите применение не- скольких методик, позволяющих обнаружить разные виды ошибок.
쐽
Существуют многие эффективные методики контроля качества, применяемые как во время конструирования, так и до его начала. Чем раньше вы обнаружи- те дефект, тем слабее он переплетется с остальным кодом и тем меньше вреда он успеет принести.
쐽
В мире программирования контроль качества ориентирован на процесс.
В отличие от промышленного производства разработка ПО не включает по- вторяющегося этапа, влияющего на конечный продукт, поэтому качество ре- зультата определяется процессом, используемым для разработки ПО.
1 ... 53 54 55 56 57 58 59 60 ... 104
464
ЧАСТЬ V Усовершенствование кода содержала 15 известных ошибок. Майерс попросил каждого программиста най- ти эти ошибки, используя одну из следующих методик:
쐽
тестирование выполнения программы по спецификации;
쐽
тестирование выполнения программы по спецификации с возможностью изу- чения исходного кода;
쐽
анализ/инспекция с использованием и спецификации, и исходного кода.
Различия эффективности обнаружения дефектов оказались очень боль- шими: программисты нашли от 1 до 9 дефектов. Средний показатель был равен 5,1, или 1/3 от общего числа известных дефектов.
При использовании одной методики никакая из них не имела статистически зна- чимого преимущества над любой другой. В то же время любая комбинация двух методик — в том числе использование одной методики двумя независимыми груп- пами — приводила к увеличению общего числа найденных дефектов почти вдвое.
В исследованиях, проведенных в Лаборатории проектирования ПО NASA, компа- нии Boeing и других компаниях, было обнаружено, что разные программисты находят разные дефекты. Только примерно каждую пятую ошибку, обнаруженную в ходе инспекций, находят двое или более разработчиков (Kouchakdjian, Green,
and Basili, 1989; Tripp, Struck, and Pflug, 1991; Schneider, Martin, and Tsai, 1992).
Майерс обращает внимание на то, что поиск одних видов ошибок оказывается более эффективным при непосредственном участии людей (например, при инспекции или анализе кода), а других видов — при компьютерном тестировании (Myers, 1979).
Этот вывод подтвердился в более позднем исследовании, показавшем, что чтение кода способствует нахождению дефектов интерфейса, а функциональное тести- рование — нахождению дефектов управляющих структур (Basili, Selby, and Hutchens,
1986). Гуру тестирования Борис Бейзер (Boris Beizer) сообщает, что неформаль- ные подходы к тестированию обычно позволяют достигнуть покрытия кода тес- тами лишь на 50–60%, если только вы не используете анализатор покрытия
(Johnson, 1994).
Таким образом, методики поиска дефектов лучше применять в комбина- ции. Джонс (Jones) также подтверждает этот вывод. Используя исключи- тельно тестирование, высоких результатов добиться невозможно. Джонс сообщает, что комбинация блочного тестирования, функционального тестирования и тестирования системы часто приводит к обнаружению менее 60% дефектов, что обычно неприемлемо для конечного продукта.
Эти данные также помогают понять, почему программисты, начинающие приме- нять дисциплинированную методику устранения дефектов, такую как экстремаль- ное программирование, добиваются более высокой степени устранения дефектов.
Как показывает табл. 20-3, набор методик устранения дефектов, применяемых в экстремальном программировании, позволяет устранить около 90% дефектов в обычной ситуации и 97% в лучшем случае, что гораздо выше среднего для отрас- ли показателя, равного 85%. Некоторые программисты связывают этот факт с синергичными отношениями между методиками экстремального программиро- вания, но на самом деле это просто предсказуемый результат использования кон- кретного набора методик устранения дефектов. Эффективность других комбинаций методик может оказаться такой же или даже более высокой, поэтому выбор кон-
ГЛАВА 20 Качество ПО
465
кретных методик устранения дефектов, позволяющих достичь желаемого уровня качества, является одним из аспектов эффективного планирования проекта.
Табл. 20-3. Эффективность обнаружения дефектов, характерная
для экстремального программирования
Методика устранения
Минимальная
Типичная
Максимальная
дефектов
эффективность
эффективность
эффективность
Неформальные обзоры
25%
35%
40%
проекта (парное программи- рование)
Неформальные обзоры кода
20%
25%
35%
(парное программирование)
Самостоятельная
20%
40%
60%
проверка кода
Блочное тестирование
15%
30%
50%
Интеграционное
25%
35%
40%
тестирование
Регрессивное тестирование
15%
25%
30%
Общая эффективность
74%
90%
97%
устранения дефектов
Стоимость нахождения дефектов
Некоторые методики обнаружения дефектов дороже других. Наиболее экономич- ные при прочих равных условиях имеют наименьшую стоимость в расчете на один обнаруженный дефект. Равенством прочих условий пренебрегать нельзя, поскольку стоимость методики в расчете на один дефект зависит от общего числа обнару- женных дефектов, этапа обнаружения каждого дефекта и других факторов, не связанных с экономическими аспектами конкретной методики.
Как правило, эксперименты показывают, что инспекции обходятся дешев- ле, чем тестирование. В исследовании, проведенном в Лаборатории про- ектирования ПО, было обнаружено, что при чтении кода число дефек- тов, находимых в час, было примерно на 80% более высоким, чем при тестирова- нии (Basili and Selby, 1987). В другой организации поиск дефектов проектирова- ния с использованием блочного тестирования был вшестеро дороже, чем при ис- пользовании инспекций (Ackerman, Buchwald, and Lewski, 1989). Более позднее ис- следование, проведенное в IBM, показало, что на обнаружение каждой ошибки раз- работчики тратили 3,5 человеко-часа в случае инспекций кода и 15–25 в случае тестирования (Kaplan, 1995).
Стоимость исправления дефектов
Стоимость нахождения дефектов — только одна часть уравнения. Другой частью является стоимость их исправления. На первый взгляд, методика обнаружения дефектов не играет роли: стоимость их исправления всегда будет одинаковой.
Это неверно, потому что чем дольше дефект остается в системе, тем больше средств придется потратить на его устранение. Следовательно, методика, способствующая раннему обнаружению ошибок, снижает стоимость их исправления. Еще важнее
466
ЧАСТЬ V Усовершенствование кода то, что одни методики — такие как инспекции — позволя- ют определить и симптомы, и причины дефектов за один этап; другие — например, тестирование — указывают на симптомы дефекта, но требуют выполнения дополнитель- ной работы для диагностики и устранения его причины. В
итоге одноэтапные методики оказываются гораздо более дешевыми, чем двухэтапные.
В одном из подразделений Microsoft обнаружили, что при использова- нии инспекции кода — одноэтапной методики — на нахождение и ис- правление дефекта уходит 3 часа, тогда как при использовании тестиро- вания — двухэтапной методики — на это требуется 12 часов (Moore, 1992). Кол- лофелло и Вудфилд сообщили, что при разработке программы из 700 000 строк,
над которой работало более 400 программистов, обзоры кода имели гораздо бо- лее высокую экономическую эффективность, чем тестирование: прибыль на ин- вестированный капитал была равной 1,38 и 0,17 соответственно (Collofello and
Woodfield, 1989).
Суть сказанного в том, что эффективная программа контроля качества должна включать комбинацию методик, применяемых на всех стадиях разработки. Для достижения высокого качества ПО можно использовать следующую комбинацию:
쐽
формальные инспекции всех требований, всех аспектов архитектуры и всех проектов критических частей системы;
쐽
моделирование или прототипирование;
쐽
чтение или инспекции кода;
쐽
тестирование выполнения программы.
20.4. Когда выполнять контроль качества ПО?
Как было отмечено в главе 3, чем раньше ошибка внедряет- ся в приложение, тем сильнее она переплетается с другими частями приложения и тем больше средств придется потра- тить на ее устранение. Дефект в требованиях может вылить- ся в один или несколько дефектов в проекте, которые могут привести к появлению множества дефектов в коде. Ошибка в требованиях может привести к разработке дополнительных компонентов архитектуры или подтолкнуть к неудачным ар- хитектурным решениям. Дополнительные архитектурные компоненты требуют написания дополнительного кода, те- стов и документации. С другой стороны, ошибка в требованиях может привести к выбрасыванию частей архитектуры, кода и тестов. Если идея устранения ошибок из чертежей дома перед заливкой фундамента бетоном кажется вам разумной, то вы согласитесь и с тем, что дефекты требований и архитектуры также следует уст- ранять до того, как они повлияют на более поздние этапы разработки.
Кроме того, ошибки в требованиях или архитектуре обычно имеют более широ- кие следствия, чем ошибки конструирования. Одна ошибка в архитектуре может затронуть несколько классов и десятки методов, тогда как одна ошибка констру-
Перекрестная ссылка О зависи- мости стоимости исправления дефектов от срока их присут- ствия в системе см. раздел «Об- ращение к данным» раздела 3.1.
Сами ошибки более подробно обсуждаются в разделе 22.4.
Перекрестная ссылка Контроль качества предварительных дей- ствий — например, определения требований и разработки архи- тектуры — в этой книге не рас- сматривается. Информацию по этим темам можно найти в кни- гах, указанных в разделе «До- полнительные ресурсы» в кон- це этой главы.
ГЛАВА 20 Качество ПО
467
ирования скорее всего повлияет только на один метод или класс. Это еще одно убедительное обоснование как можно более раннего нахождения ошибок.
Дефекты проникают в ПО на всех стадиях разработки, поэтому контро- лю качества следует уделять должное внимание на всех этапах проекта,
начиная с самых ранних. Контроль качества нужно внести в планы в начале работы над программой; его следует выполнять по мере прогресса; нако- нец, он должен подчеркивать удачное завершение работы над проектом.
20.5. Главный Закон Контроля Качества ПО
Ни в одном ресторане посетителей не кормят бесплатно, и даже если б кормили, никто не смог бы поручиться за качество блюд. Однако разра- ботка ПО — совсем не кулинарное искусство, и качество ПО имеет одну важную необычную особенность. Главный Закон Контроля Качества ПО заключа- ется в том, что повышение качества системы снижает расходы на ее разработку.
В основе этого закона лежит одно важное наблюдение: лучшим способом повы- шения производительности труда программистов и качества ПО является мини- мизация времени, затрачиваемого на исправление кода, чем бы оно ни объясня- лось: изменениями требований, изменениями проекта или отладкой. Средняя для отрасли производительность труда программистов эквивалентна примерно 10–
50 строкам кода на одного человека в день (с учетом всех затрат, не связанных с кодированием). Написание 10–50 строк кода требует нескольких минут, — на что же уходит остальное время?
Такая, казалось бы, низкая производительность труда час- тично объясняется тем, что в подобных средних показате- лях учитывается время, не связанное непосредственно с программированием. Время тестировщиков, руководителей,
секретарей — все эти факторы включены в данный показа- тель. Определение требований, разработка архитектуры и другие действия, не относящиеся к кодированию, также отра- жены в «строках кода в день». Однако основные временные затраты объясняются не этим.
Самый длительный этап в большинстве проектов — отладка и исправление не- правильного кода. При традиционном цикле разработки ПО эти действия зани- мают около 50% времени (см. раздел 3.1). Сокращение потребности в отладке,
достигаемое благодаря предотвращению ошибок, повышает производительность труда. Следовательно, наиболее очевидный метод сокращения графика разработ- ки — повышение качества ПО и снижение объема времени, уходящего на его отладку и исправление.
Этот анализ подтверждается реальными данными. В обзоре 50 проектов,
потребовавших более 400 человеколет и включивших почти 3 000 000
строк кода, проведенном в Лаборатории проектирования ПО NASA, было обнаружено, что повышенное внимание к контролю качества позволяло снизить уровень ошибок, но не повышало общие расходы на разработку (Card, 1987).
Перекрестная ссылка О разли- чиях между написанием отдель- ной программы и созданием программного продукта см. под- раздел «Программы, продукты,
системы и системные продукты»
раздела 27.5.
468
ЧАСТЬ V Усовершенствование кода
В исследовании, проведенном в IBM, были получены аналогичные результаты:
Программным проектам с наименьшими уровнями дефектов соответствовали самые короткие графики разработки и максимальные показатели производитель- ности труда… устранение дефектов на самом деле — самый дорогой и длитель- ный этап разработки ПО (Jones, 2000).
Это верно и для противоположного края шкалы. В одном исследовании
1985 года ученые попросили 166 профессиональных программистов написать программы по одной и той же спецификации. Итоговые про- граммы содержали в среднем 220 строк, а на их написание ушло в среднем чуть меньше 5 часов. Результаты оказались поистине удивительными: программисты,
работавшие над своими программами средний объем времени, допустили наиболь- шее число ошибок. Программисты, которым потребовалось больше или меньше времени, допустили значительно меньше ошибок (DeMarco and Lister, 1985). Ре- зультаты показаны на рисунке 20-2.
Рис. 20-2. Ни при самом быстром, ни при самом медленном подходе к разработке
ПО не наблюдается наибольший уровень дефектов
В сравнении с самой быстрой группой двум самым медленным группам понадо- билось примерно в 5 раз больше времени для достижения результата с примерно тем же уровнем дефектов. Таким образом, на создание ПО без дефектов не всегда уходит больше времени, чем на написание ПО с дефектами.
Вероятно, в некоторых случаях контроль качества требует значительных затрат.
Если вы пишете приложение управления космическим кораблем или медицин- ской системой жизнеобеспечения, высокие требования к надежности ПО делают проект более дорогим.
В сравнении с традиционным циклом «кодирование — тестирование — отладка»
улучшенная программа контроля качества ПО оказывается более экономичной.
Она перенаправляет ресурсы от отладки и рефакторинга к предварительным этапам контроля качества. Предварительные этапы влияют на качество системы больше,
чем последующие, поэтому время, потраченное на предварительных этапах, по- зволяет сэкономить больше времени потом. Результатом является снижение уровня
ГЛАВА 20 Качество ПО
469
дефектов, сокращение сроков разработки и снижение затрат. В трех следующих главах вы найдете еще несколько примеров, иллюстрирующих Главный Закон
Контроля Качества ПО.
Контрольный список: план контроля качества
Идентифицировали ли вы специфические характеристики качества, имеющие особую важность в вашем проекте?
Сообщили ли вы другим программистам целевые характеристики качества?
Провели ли вы различие между внешними и внутренними характеристика- ми качества?
Обдумали ли вы, как некоторые характеристики могут усиливать или ос- лаблять другие?
Призывает ли ваш проект к использованию нескольких методик обнаруже- ния ошибок, ориентированных на поиск разных видов ошибок?
Составили ли вы план контроля качества, охватывающий все этапы разра- ботки ПО?
Оцениваете ли вы качество системы каким-нибудь образом, чтобы можно было определить, повышается оно или понижается?
Понимают ли руководители, что контроль качества требует дополнительных расходов в начале проекта, но зато позволяет добиться общей экономии средств?
Дополнительные ресурсы
Составить список книг для этой главы несложно, потому что методики повышения качества ПО и производительности труда описываются почти во всех трудах, посвященных эф- фективным методологиям разработки ПО. Сложность в том, чтобы выделить книги,
касающиеся непосредственно качества ПО. Ниже я указал две такие работы.
Ginac, Frank P.
Customer Oriented Software Quality Assurance. Englewood Cliffs, NJ: Prentice
Hall, 1998. В этой очень краткой книге описаны атрибуты качества, метрики каче- ства, программы контроля качества, роль тестирования в контроле качества, а так- же известные программы повышения качества, в том числе модель CMM, разрабо- танная в институте Software Engineering Institute, и стандарты ISO серии 9000.
Lewis, William E.
Software Testing and Continuous Quality Improvement, 2d ed. Auer- bach Publishing, 2000. В этой книге можно найти подробное обсуждение цикла контроля качества, а также методик тестирования. Кроме того, в ней вы найдете много контрольных форм и списков.
Соответствующие стандарты
IEEE Std 730-2002 — стандарт IEEE планирования контроля качества ПО.
IEEE Std 1061-1998 — стандарт IEEE методологии метрик качества ПО.
IEEE Std 1028-1997 — стандарт обзоров ПО.
http://cc2e.com/2043
http://cc2e.com/2050
http://cc2e.com/2057
470
ЧАСТЬ V Усовершенствование кода
IEEE Std 1008-1987 (R1993) — стандарт блочного тестирования ПО.
IEEE Std 829-1998 — стандарт документирования тестов ПО.
Ключевые моменты
쐽
Высокого качества можно достичь без дополнительных затрат, но для этого вы должны перераспределить ресурсы и предотвращать дефекты вместо того,
чтобы их исправлять.
쐽
Стремление к одним характеристикам качества препятствует достижению дру- гих. Четко определите цели, имеющие для вас первостепенную важность, и сообщите об этом всем членам группы.
쐽
Никакая методика обнаружения дефектов не является достаточно эффектив- ной. Тестирование само по себе — не самый лучший способ устранения оши- бок. Составляя программу контроля качества, предусмотрите применение не- скольких методик, позволяющих обнаружить разные виды ошибок.
쐽
Существуют многие эффективные методики контроля качества, применяемые как во время конструирования, так и до его начала. Чем раньше вы обнаружи- те дефект, тем слабее он переплетется с остальным кодом и тем меньше вреда он успеет принести.
쐽
В мире программирования контроль качества ориентирован на процесс.
В отличие от промышленного производства разработка ПО не включает по- вторяющегося этапа, влияющего на конечный продукт, поэтому качество ре- зультата определяется процессом, используемым для разработки ПО.
1 ... 53 54 55 56 57 58 59 60 ... 104