
1. Качество по
Качество - это цель инженерной деятельности; построение качественного программного обеспечения (ПО) (software) - цель программной инженерии (software engineering) .ПО это набор программ и соответствующая им документация. Качество ПО лучше всего описывается комбинацией ряда факторов.
1.1 Внешние и внутренние факторы
Наличие или отсутствие таких качеств, как скорость и простота использования ПО, может быть обнаружено его пользователями. Эти качества можно назвать внешними факторами качества.
Под словом «пользователи» нужно понимать не только людей, взаимодействующих с конечным продуктом, но и тех, кто их закупает, занимается администрированием. Такое свойство, например, как легкость адаптации продуктов к изменениям спецификаций - расширяемость - попадает в категорию внешних факторов, поскольку она может представлять интерес для администраторов, закупающих продукт, хотя и не важна для конечных пользователей, непосредственно работающих с продуктом.
Такие характеристики ПО, как модульность или читаемость, являются внутренними факторами, понятными только для профессионалов, имеющих доступ к тексту ПО. В конечном счете, только внешние факторы имеют значение. Но ключ к достижению внешних факторов спрятан во внутренних факторах: для того, чтобы достичь видимого качества, проектировщики и конструкторы должны иметь внутренние приемы, позволяющие улучшать скрытые от пользователя качества.
1.2 Обзор внешних факторов
Корректность (Correctness)
Корректность - это способность ПО выполнять точные задачи так, как они определены их спецификацией.
Корректность является важнейшим качеством. Если система не делает того, что она должна делать, то все остальное - ее быстродействие, хороший пользовательский интерфейс - не имеет особого значения.
В условном подходе к корректности мы заботимся только о том, чтобы обеспечить корректность каждого уровня, основываясь на предположении, что нижележащие уровни корректны. Это единственно реалистичный подход, поскольку он позволяет разделить проблему и на каждой ступени сконцентрироваться на ограниченном круге задач.
Устойчивость (Robustness)
Устойчивость - это способность ПО соответствующим образом реагировать на аварийные ситуации.
Устойчивость дополняет корректность. Корректность относится к поведению системы в случаях, определенных спецификацией; устойчивость характеризует то, что происходит за пределами этой спецификации. Невозможно сказать, как в случае с корректностью, что в аварийных ситуациях система должна выполнять свои задачи, поскольку ситуации выходят за пределы спецификации. Если бы эти задачи были известны, аварийный случай стал бы частью спецификации, и мы бы снова вернулись в область корректности.
Роль требования устойчивости - удостовериться, что и в таких случаях система не приводит к непоправимой ситуации.
Расширяемость (Extendibility)
Расширяемость - это легкость адаптации ПО к изменениям спецификации.
Проблема расширяемости это проблема масштаба. Для маленьких программ изменение не является обычно большой проблемой, но по мере увеличения ПО адаптация становится все труднее. Большая программная система часто видится как огромный карточный дом, удаление одного элемента может привести к разрушению всего построения.
Для улучшения расширяемости важны два принципа:
• Простота построения: простая архитектура легче адаптируется к изменениям, чем сложная.
• Децентрализация: чем более автономны модули, тем выше вероятность того, что простое изменение затронет только один или небольшое количество модулей и не вызовет цепную реакцию изменений во всей системе.
Повторное использование (Reusability)
Повторное использование есть способность элементов ПО служить для построения многих различных приложений. Необходимость и возможность повторного использования возникает из наблюдений сходства систем - системы ПО часто имеют похожую схему. Следует использовать это сходство и не изобретать велосипед заново. Понимание этой схемы даст возможность повторно применять созданный элемент ПО во многих других разработках. Повторное использование влияет на все остальные аспекты качества ПО. Поскольку решение проблемы повторного использования в сущности означает, что нужно писать меньше программ, следовательно, можно прилагать больше усилий (при той же общей стоимости) к улучшению других факторов.
Совместимость (Compatibility)
Совместимость - это легкость сочетания одних элементов ПО с другими.
Совместимость важна, поскольку мы не разрабатываем элементы ПО в вакууме: им необходимо взаимодействовать друг с другом. Ключ к совместимости находится в однородности построения и в стандартных соглашениях на коммуникации между программами. Эти подходы включают:
• Стандартные форматы файлов.
• Стандартные структуры данных.
• Стандартные пользовательские интерфейсы.
Большая общность достигается при определении стандартных протоколов доступа ко всем важным элементам.
Эффективность (Effciency)
Эффективность - это способность ПО как можно меньше зависеть от ресурсов оборудования: процессорного времени, пространства, занимаемого во внутренней и внешней памяти, пропускной способности, используемой в устройствах связи.
В программистском сообществе есть два типичных отношения к эффективности:
• Некоторые разработчики одержимы проблемами производительности, что заставляет их прилагать много усилий к предполагаемой оптимизации.
• Существует общая тенденция недооценки вопросов эффективности, вытекающая из справедливых убеждений, существующих в промышленности: «сделай правильно, прежде чем сделать быстро» и «модель компьютера будущего года все равно будет на 50% быстрее».
Переносимость (Portability)
Переносимость - это легкость переноса ПО в различные программные и аппаратные среды.
Переносимость имеет дело с разнообразием не только физического оборудования, но чаще аппаратно-программного механизма, того, который мы действительно программируем, включающего операционную систему, систему окон, если она применяется, и другие основные инструменты.
Простота использования (Easy of Use)
Простота использования - это легкость, с которой люди с различными знаниями и квалификацией могут научиться использовать ПО и применять его для решения задач. Сюда также относится простота установки, работы и текущего контроля.
Хорошие проектировщики пользовательского интерфейса придерживаются более осмотрительной политики. Они делают как можно меньше предположений относительно своих пользователей.
Функциональность (Functionality)
Ф
ункциональность
- это степень возможностей, обеспечиваемых
системой.
Одна из самых трудных проблем, с которой сталкивается руководитель проекта, - определение достаточной функциональности.
Расширение свойств системы приводит к двум проблемам, одна сложнее другой. Более простая проблема - потеря непротиворечивости, которая может возникнуть при добавлении новых свойств, затрагивающих простоту использования.
Хорошее ПО основывается на небольшом количестве сильных идей. У него может быть много специальных свойств - все они должны быть следствиями основных положений.
Более сложная проблема - слишком большое внимание к одним свойствам в ущерб другим качествам системы. В проектах часто встречается ошибка: Нижняя кривая описывает фичеризм: в лихорадочной погоне за дополнительными свойствами теряется нить общего качества. Завершающая фаза такого проекта, предполагающая общую корректировку всех свойств, может быть долгой и напряженной. Если под давлением пользователей или конкурентов вы вынуждены выпустить продукт достаточно быстро - на стадиях, отмеченных на рисунке квадратами, - результат может повредить вашей репутации. Осмонд предлагает (верхняя кривая) во время создания проекта поддерживать на высоком постоянном уровне качество всех факторов, кроме функциональности. Никаких компромиссов по надежности, расширяемости и прочим факторам: вы просто отказываетесь от добавления новых свойств до тех пор, пока вас удовлетворяют существующие.
Своевременность (Timeliness)
Своевременность - это выпуск ПО в нужный момент, то есть тогда или незадолго до того, как у пользователей появилась соответствующая потребность в подобной системе.
Верифицируемость (Verifiability) - это легкость подготовки процедур приемки, особенно тестовых данных, процедур обнаружения неполадок и трассировки ошибок на этапах заключительной проверки и введения проекта в действие.
Целостность (Integrity) - это способность ПО защищать свои различные компоненты (программы, данные) от несанкционированного доступа и модификации.
Восстанавливаемость (Repairability) - это способность облегчать устранение дефектов.
Экономичность (Economy) сочетается c своевременностью - это способность системы завершиться, не превысив выделенного бюджета или даже не истратив его.
О документации
Необходимость документации является следствием других факторов качества, рассмотренных выше. Выделим три вида документации:
• Внешнюю, дающую пользователям возможность понять сильные стороны системы и удобство их использования. Необходимость в ней является следствием простоты использования системы.
• Внутреннюю, дающую разработчикам ПО возможность понять структуру и реализацию системы, - следствие требования расширяемости.
• Описывающую интерфейс модулей. Она дает возможность разработчикам понять функции, реализованные модулем, без изучения его реализации. Этот вид документации является следствием требования повторного использования и расширяемости, поскольку документация позволяет определить, будет ли данное изменение влиять на определенный модуль.
Документацию не следует считать независимой частью проекта.
Компромиссы
Экономичность часто конфликтует с функциональностью. Оптимальная эффективность требует полной адаптации к определенному оборудованию и программной среде, что является противоположностью переносимости. Повторное использование требует решения общих задач, что расширяет границы, заданные спецификацией. Давление своевременности может склонить нас к технике RAD - быстрой разработки приложения (Rapid Application Development) , что может повредить расширяемости. Хотя во многих случаях удается найти решение, примиряющее явно конфликтующие факторы, иногда приходится идти на компромисс.
Как бы ни были необходимы компромиссы между факторами качества, один из факторов стоит в стороне от остальных - корректность. Нет никакого оправдания тому, что корректность подвергается опасности ради других факторов, таких как эффективность. Если ПО не выполняет свою функцию, все остальное не имеет смысла.
Все описанные выше факторы важны. Но при современном состоянии индустрии ПО четыре фактора
имеют особую важность:
Корректность и устойчивость: все еще слишком трудно создавать ПО без ошибок (bugs) , и слишком сложно исправлять ошибки, когда они появляются. Разновидности технических приемов для улучшения корректности и устойчивости одни и те же: более систематические подходы к построению ПО; более формальные спецификации; встроенный контроль в течение всего процесса построения ПО (не просто испытания и отладка после создания) ; более совершенные языковые механизмы, такие как статическая типизация, утверждения, автоматическое управление памятью и упорядоченное управление исключительными ситуациями, обеспечение возможности разработчикам устанавливать требования корректности и устойчивости в сочетании с возможностью инструментов обнаруживать случаи несостоятельности до того, как они приведут к ошибкам. Близость вопросов корректности и устойчивости делает удобным введение общего термина для обозначения обоих факторов - надежность (reliability) .
Расширяемость и повторное использование: ПО должно быть легко изменяемым; компоненты создаваемого ПО должны быть широко применимы, и должен существовать больший перечень общецелевых компонентов, которые можно повторно использовать при разработке новой системы. Здесь также одни и те же идеи полезны для улучшения обоих качеств: любая идея, помогающая производить продукт с более децентрализованной архитектурой, компоненты которой автономны и взаимодействуют только через ограниченные и ясно определенные каналы, будет полезной. Термин модульность (modularity) включает повторное использование и расширяемость.
ОО-метод может значительно улучшить четыре основных фактора качества, вот почему он так привлекателен. Он также может внести значительный вклад в другие аспекты, в частности:
Совместимость: метод обеспечивает общий стиль проектирования и стандартизацию интерфейсов модулей и систем, что помогает совместно работать разным системам.
Переносимость: уделяя особое внимание абстракции и скрытию информации, объектная технология способствует тому, что проектировщики начинают отделять спецификацию от особенностей реализации, что и облегчает перенос.
Простота использования: вклад ОО-инструментов в современные интерактивные системы, и особенно их пользовательские интерфейсы.
Эффективность: повторное использование компонентов профессионального качества часто может значительно улучшить производительность.
Своевременность, экономичность и функциональность: ОО-техника дает возможность тем, кто ее освоил, производить ПО быстрее и по более низкой стоимости; она облегчает добавление функций
и даже сама может предложить новые функции.