ТЕХНОЛОГИЯ РАЗРАБОТКИ ПРИКЛАДНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
Соловьев С. В., Цой Р. И., Гринкруг Л. С.,
Характеристики качества программного изделия Определение качества какой-либо продукции, как совокупности ее свойств, обусловливающих способность удовлетворять определенной потребности в соответствии с назначением, можно отнести и к программным изделиям (ПИ).
Формализации характеристик качества ПИ посвящен ряд нормативных документов, как международных, так и российских, где выделены группы показателей, позволяющие оценивать ПИ с позиции пользователя, разработчика и управляющего проектом. Перечислим некоторые их них:
ISO 9000-3:1991. Общее руководство качеством и стандарты по обеспечению качества. Указания по применению ISO 9001 при разработке, поставке и обслуживанию программного обеспечения;
ISO 9126:1991 ИТ. Оценка программного продукта. Характеристики качества и руководство по их применению;
ISO 12119:1994. Требования к качеству и тестированию;
ГОСТ 28195-89. Оценка качества программных средств. Общие положения;
ГОСТ 28806-90. Качество программных средств. Термины и определения.
Например, в международном стандарте ISO 9126:1991 рекомендуется шесть основных характеристик качества программных изделий, каждая из которых детализируется несколькими факторами (рис. 12).
Функциональная пригодность характеризуется пригодностью для применения (в соответствии с требованиями технического задания), точностью выполняемых расчетов (в соответствии с их назначением), защищенностью от несанкционированного копирования или использования, способностью к взаимодействию с другими программными продуктами, согласованностью с международными, государственными, отраслевыми стандартами и правилами проектирования.Надежность характеризуется уровнем завершенности (отсутствием дефектов), устойчивостью к ошибкам и запуском после сбоев.Применимость характеризуется понятностью, обучаемостью и простотой использования. Пользователь должен иметь возможность вникнуть в смысл документации, сопровождающей программное изделие, понять его функциональное назначение, обучиться работе с программным изделием. Интуитивно понятный интерфейс пользователя - это свидетельство качественной работы всех групп разработчиков, которые участвовали в создании пакета прикладных программ.
Рис. 12. Характеристики качества программного изделия
Эффективность характеризуется ресурсной и временной экономичностью. Выполнение требуемых функций при минимальных затратах времени, приемлемые требования к оперативной и внешней памяти, к тактовой частоте центрального процессора и пропускной способности шин является одним из показателей качества ПИ. Сопровождаемость характеризуется удобством для анализа замечаний пользователей, простотой внесения изменений, стабильностью работы и тестируемостью ППП после внесения изменений и исправлений в процессе его сопровождения. Переносимость характеризуется адаптируемостью к аппаратным и программным платформам, структурированностью, т.е. использованием при разработке модулей ППП принципов структурного и/или объектно-ориентированного подхода, простотой внедрения ППП в информационную систему предприятия или замещения им действующих программных средств.
Характеристики и факторы в стандарте определены кратко, без комментариев и рекомендаций по их применению к конкретным системам и проектам. Дальнейшая детализация показателей качества проводится различными метриками, которые оцениваются при помощи экспертных методов. Состав используемых факторов, метрик и критериев оценки предлагается выбирать в зависимости от назначения, функций и этапов жизненного цикла программного изделия.
Например, для обобщенной характеристики качества пакета прикладных программ при сравнении его с аналогами можно использовать комплексный показатель качества:
где n - |
число рассматриваемых показателей xi; |
bi - |
весовой коэффициент i-го показателя, назначаемый в соответствии с потребностями организации, предполагающей использовать пакет прикладных программ. |
Пример расчета комплексного показателя качества J, для данных, приведенных в табл. 4, показывает, что новый пакет прикладных программ обладает более высокими потребительскими характеристиками по сравнению с аналогом.
Основные понятия и показатели надежности программных средств
Рассмотрим более подробно одну из характеристик качества программного изделия - надежность. Надежность - это свойство объекта выполнять заданные функции, сохраняя во времени значения установленных эксплуатационных показателей в заданных пределах, соответствующих заданным режимам и условиям использования, технического обслуживания, ремонта, хранения и транспортирования.
Таким образом, надежность является внутренним свойством системы, заложенным при ее создании и проявляющимся во времени при функционировании и эксплуатации.
Свойства надежности изделий изучаются в рамках теории надежности, которая включает в себя математические модели и методы, направленные на решение проблем предсказания, оценки и оптимизации различных показателей надежности.
Например, надежность технических систем определяется в основном двумя факторами: надежностью компонент и дефектами конструкции, допущенными при проектировании или изготовлении. Относительно невысокая физическая надежность компонент, их способность к разрушению, старению или снижению надежности в процессе эксплуатации привели к тому, что этот фактор оказался доминирующим для большинства комплексов аппаратуры.
Надежность сложных программных средств определяется этими же факторами, однако доминирующими являются дефекты и ошибки проектирования, так как физическое хранение программ на магнитных носителях характеризуется очень высокой надежностью. Программа любой сложности и назначения, при строго фиксированных исходных данных и надежной аппаратуре, исполняется по однозначно определенному маршруту, и дает на выходе строго определенный результат. Однако случайное изменение исходных данных и накопленной при обработке информации, а также множество условных переходов в программе создают огромное число различных маршрутов исполнения каждого сложного ППП. Источниками ненадежности являются непроверенные сочетания исходных данных, при которых ППП дает неверные результаты или отказы. В результате комплекс программ не соответствует требованиям функциональной пригодности и работоспособности.
При применении понятий надежности к программным средствам следует учитывать особенности и отличия этих объектов от традиционных технических систем, для которых первоначально разрабатывалась теория надежности:
не для всех видов программ применимы понятия и методы теории надежности. Их можно использовать только к программным средствам, функционирующим в реальном времени и непосредственно взаимодействующим с внешней средой;
относительно редкое разрушение программных компонент и необходимость их физической замены, приводит к принципиальному изменению понятий сбоя и отказа программ, к разделению их по длительности восстановления относительно некоторого допустимого времени простоя для функционирования информационной системы;
для повышения надежности комплексов программ особое значение имеют методы введения в программные средства временной, программной и информационной избыточности;
непредсказуемость места, времени и вероятности проявления дефектов и ошибок, а также их редкое обнаружение при реальной эксплуатации достаточно надежных программных средств, не позволяет эффективно использовать традиционные методы априорного расчета показателей надежности сложных систем, ориентированные на стабильные, измеряемые значения надежности составляющих компонент;
традиционные методы форсированных испытаний надежности систем путем физического воздействия на их компоненты не применимы для программных средств, и их следует заменять методами форсированного воздействия информационных потоков внешней среды.
С учетом перечисленных особенностей теория надежности стала развиваться в особом направлении - надежности программных средств (Software Reliability).
К задачам теории и анализа надежности сложных программных средств можно отнести следующие:
формулирование основных понятий, используемых при исследовании и применении показателей надежности программных средств;
выявление и исследование основных факторов, определяющих характеристики надежности сложных программных комплексов;
выбор и обоснование критериев надежности для комплексов программ различного типа и назначения;
исследование дефектов и ошибок, динамики их изменения при отладке и сопровождении, а также влияния на показатели надежности программных средств;
исследование и разработка методов структурного построения сложных программных средств, обеспечивающих их необходимую надежность;
исследование методов и средств контроля и защиты от искажений программ, вычислительного процесса и данных путем использования различных видов избыточности и помехозащиты;
разработка методов и средств определения, прогнозирования характеристик надежности в жизненном цикле комплексов программ с учетом их функционального назначения, сложности, структурного построения и технологии разработки.
В основе теории надежности лежат понятия о двух возможных состояниях сложной системы - работоспособном и неработоспособном. Работоспособным называется такое состояние системы, при котором она способна выполнять заданные функции с параметрами, установленными технической документацией. В процессе функционирования возможен переход системы из работоспособного состояния в неработоспособное (отказ) и обратно (восстановление).
При длительности восстановления, меньшей заданного значения, дефекты и аномалии при функционировании программ относят к сбоям, а при восстановлении, превышающем по длительности пороговое значение, происходящее искажение называют отказом.Надежная программа должна обеспечивать достаточно низкую вероятность отказа в процессе функционирования в реальном времени. Быстрое реагирование на искажения программ, данных или вычислительного процесса и восстановление работоспособности за время меньшее, чем порог между сбоем и отказом, обеспечивают высокую надежность программ. При этом отказ не фиксируется и такие события не влияют на основные показатели надежности - наработку на отказ и коэффициент готовности.
Для определения средней длительности наработки на отказ Tf измеряется время работоспособного состояния системы между последовательными отказами или началами нормального функционирования системы после них. Вероятностные характеристики этой величины используются в качестве критерия надежности. Коэффициент готовности Кг отражает вероятность иметь восстанавливаемую систему в работоспособном состоянии в произвольный момент времени. Значение коэффициента готовности соответствует доле времени полезной работы системы на достаточно большом интервале, содержащем отказы и восстановления:
где Тг - среднее время восстановления, включающее время, затраченное на обнаружение и локализацию отказа, время устранения отказа, время тестирования с учетом возможности многократных отказов и восстановлений. Дефекты программных изделий
Программные изделия (ПИ) представляют собой сложные объекты и формулирование требований для них - задача очень сложная. Поэтому в реализующем эти требования ПИ неизбежны несоответствия между тем, как заказчик понимает свои требования, и тем, как они проявляются в поведении разработанного исполнителем ПИ. Кроме того, некоторые из спецификаций заказчик предполагает неявно, что также служит источником расхождений в оценке поведения ПИ.
Эти расхождения можно назвать дефектом программного изделия. Тогда количественной характеристикой качества можно считать плотность оставшихся в программном изделии дефектов после поставки его заказчику.
Плотность дефектов в ПИ принято определять как отношение количества оставшихся в ПИ дефектов к общему размеру его программного кода.
Размер программного кода ПИ измеряется числом строк кода (LOC - Lines of Code) или тысяч строк кода (KLOC). Для обеспечения возможности сравнения размеров кодов, написанных на разных языках программирования, применяется единица измерения «тысяча строк эквивалентного ассемблерного кода» (KAELOC - К of Assembler Equivalent Lines of Code).
Для различных языков программирования статистически выявлены коэффициенты пересчета KLOC данного языка программирования в KAELOC, которые представлены в табл. 5.
При поставке ПИ заказчику оценку его качества определяют по плотности оставшихся в нем дефектов, приведенной к размеру программного кода в 1 000 KAELOC. В любом ПИ теоретически дефекты могут содержаться в каждой строке кода.
Тогда можно считать, что в ПИ размером в 1 000 KAELOC распределение вероятностей строк кода, содержащих дефекты и принятых за случайные величины, подчиняется нормальному закону распределения, плотность вероятности которого определяется по формуле
где m - |
математическое ожидание; |
s - |
среднеквадратичное отклонение. |
В практике производства программного изделия считают, что его качество имеет уровень is, если количество строк кода, не содержащих дефекты, попадает в интервал [m - is; m + is] относительно математического ожидания m.
Оставшиеся за пределами этого интервала строки кода, содержащие ошибки, определяют плотность дефектов в поставляемом ПИ.
Например, интеграл при s = 1.
Поэтому количество строк, содержащих дефекты, составляет 31,73 % от всех строк кода.
В действительности в поставляемом программном изделии распределение вероятностей строк кода, содержащих ошибки, отличается от нормального. Поэтому для оценки качества программного изделия используют, по аналогии с промышленным производством в машиностроении, несколько увеличенные плотности дефектов (табл. 6).
Таблица 6
Плотности дефектов в поставляемом ПИ в зависимости от уровня его качества
Тогда при уровне качества 6 сигм заказчику может быть поставлено программное изделие, в котором может быть только 3-4 дефекта на миллион строк ассемблерного эквивалента.
Это очень высокий уровень качества программного изделия, к нему должны стремиться все современные производители программного обеспечения.
Существует правило: если организация хочет иметь возможность выпускать программное изделие с уровнем качества is в плановые сроки без превышения установленных людских и финансовых ресурсов, необходимо, чтобы в этой организации был достигнут уровень качества выполнения проекта в целом не ниже, чем (i - 1) сигма. Концепция качества Six Sigma
Концепцию качества «6 сигма» (Six Sigma) в 80-х годах предложила корпорация Motorola. Ее инженеры пришли к выводу, что новые продукты, которые часто не оправдывают ожиданий пользователей, можно с самого начала производить без дефектов.
Это была поистине революционная идея для промышленного производства: соотносить требования потребителей и производительность с теми показателями, которые заложены в продукт еще в процессе производства, а не после него (табл. 7).
Прежние методики контроля качества, предлагаемые в 70-е и 80-е годы, были направлены «на устранение дефектов ради самого их устранения». Данная методика предусматривает постоянное и комплексное управление качеством. Она, как большинство программ, связанных с управлением, основана на использовании различных метрик качества, например, «важность для качества» (critical-to-quality - CTQ).
Как только заказчики определили, что для них наиболее важно, компания определяет, какие действия могут больше всего повлиять на оперативное выполнение заказа, и количественно оценивают эти действия посредством CTQ. Или посредством количества дефектов в 1 000 KAELOC. Возможно более широкое понятие «вероятного числа дефектов на миллион» экземпляров продукта (defect-per-million opportunity - DPMO).
Развитие этих и других идей менеджмента качества привело к появлению в 1986 году серии стандартов ISO 9000, определяющих требования к системам качества компаний. Стандарты ISO 9000
Разработчиком стандартов является Международная организация стандартизации (ISO), находящаяся в Женеве. Например, версия 1994 года - ISO 9000:1994 и версия ISO 9000:2000.
Целью стандартов ISO 9000 является создание в компании системы качества, обеспечивающей непрерывное улучшение деятельности компании на всех этапах жизненного цикла продукции: от маркетинга до утилизации.
В стандарте сформулирован перечень обобщенных, подходящих для любой отрасли требований, выполнение которых подтверждает стремление компании к постоянному совершенствованию своей деятельности.
Составляющими ISO 9000:1994 являются, во-первых, собственно стандарты, на соответствие которым и проходит сертификация:
ISO 9001 - обеспечение качества при проектировании, разработке, производстве, монтаже и обслуживании;
ISO 9002 - обеспечение качества при производстве, монтаже и обслуживании;
ISO 9003 - обеспечение качества при окончательном контроле и испытаниях.
Фактически, стандарты 9002 и 9003 являются выборками из стандарта 9001.
Таким образом, система качества предполагает построение такой структуры управления процессом производства, которая гарантирует выпуск качественного продукта в любой момент, пока система действует. Внедрение стандартов ISO 9000 часто влечет за собой серьезный бизнес-реинжиниринг организации.
Что же необходимо для внедрения полноценной системы качества? Во-первых, это обязывает предприятие задокументировать всю свою деятельность по указанным в табл. 8 двадцати направлениям, а также обеспечить реальное функционирование бизнес-процессов в организации в полном соответствии с ними. Конечным этапом становится проверка соответствия разработанной системы управления требованиям стандарта ISO 9000 и сертификация системы качества соответствующей аудиторской фирмой. Во-вторых, это рекомендации по выбору и внедрению системы качества:
ISO 9000 - содержит рекомендации по выбору соответствующей системы качества;
ISO 9004 - это рекомендации по внедрению систем качества. В-третьих, словарь терминов ISO 8402. В-четвертых, рекомендации по проведению аудитов систем качества ISO 10011, 10012, 10013.
Существуют также национальные версии этих стандартов. В России разработана серия ГОСТов под общим названием ИСО 9000. Она принципиально не отличается от международной серии.
Таблица 8 Составляющие стандартов ISO 9001, 9002 и 9003
Знак «+» означает, что требование предъявляется; «-» - требование отсутствует; «+*» - требование облегчено.
Хотя это и дорогостоящее дело, но компании стремятся соответствовать ISO 9000, т.к. возрастают требования заказчиков. К тому же это отличный маркетинговый ход: «Мы сертифицированы по ISO 9000, нам можно доверять». И, конечно же, этот процесс с лихвой должен окупиться последующим снижением потерь, неизбежно возникающих при выпуске товара, не удовлетворяющего требованиям потребителя. СТАДИИ РАЗРАБОТКИ ПАКЕТОВ
ПРИКЛАДНЫХ ПРОГРАММ
Виды работ Период жизненного цикла пакетов прикладных программ (ППП) состоит из трех фаз (рис. 13): разработки, эксплуатации и сопровождения. Причем фазы эксплуатации и сопровождения протекают параллельно.
Рис. 13. Взаимосвязь фаз жизненного цикла (ЖЦ) ППП
Процессы, происходящие в каждой фазе, регламентирует стандарт ISO/IEC 12207. Фаза разработки каскадной и спиральной модели ЖЦ состоит из следующих этапов:
Фаза разработки включает:
1. Формирование требований к ППП:
концептуализация проекта;
планирование работ;
разработка требований.
2. Проектирование:
разработка внешних спецификаций;
разработка внутренних спецификаций (или низкоуровневое, техническое проектирование).
3. Программирование (кодирование) модулей.
4. Тестирование:
модульное (автономное) тестирование;
комплексное (интеграционное) тестирование;
системное тестирование. Формирование требований к ППП
Главной целью формирования требований является отражение потребностей пользователей. К пользователям создаваемого программного продукта можно отнести заказчика и массового потребителя.
Поэтому проекты по созданию пакетов прикладных программ можно разбить на две группы: управляемые заказчиком (заказные ППП) и независимые от заказчика (коммерческие ППП).Для проектов первой группы требования формулируются организацией-заказчиком. Однако если разработчики не привлекаются к выработке требований, увеличивается вероятность неправильной интерпретации или ошибочного понимания уже утвержденных требований. Разработчики и заказчики имеют свой собственный набор приоритетов по взглядам на проект.
Заказчики заинтересованы в наличии строго определенного регламента на все процессы выполнения заказа.
Для этого, как минимум, необходимо:
критерии оценки трудоемкости и длительности проекта;
прозрачность проекта, т.е. возможность тотального контроля по ходу выполнения проекта на полноту и качество.
Разработчики часто не обладают достаточными навыками и квалификацией для того, чтобы быстро и точно понять предметную область пакета и корректно специфицировать требования заказчика. Для проектов второй группы совокупность требований разрабатывается самой фирмой-разработчиком пакета на основе маркетинговых исследований потребностей рынка в конкретном программном изделии: изучаются программные продукты-конкуренты и аналоги, обобщаются требования пользователей к программному продукту, устанавливается потенциальная емкость рынка сбыта, дается прогноз цены и объема продаж.
Нередко во взаимоотношениях заказчика и разработчика возникает ситуация: один знает что, но не знает как, а другой, наоборот, понимает как, но не знает что. Поэтому наиболее оптимальной является совместная работа разработчиков и заказчиков по выработке требований (рис. 14).
На этапе разработки требований необходимо выполнить следующие действия:
1. Концептуализация проекта:
на основе исследования предметной области сформулировать цели создания ППП;
описать функциональные задачи, для решения которых предназначен создаваемый ППП, и их взаимосвязь;
выявить наличие информации, необходимой для выполнения планируемых функций;
Рис. 14. Вариант структуры исполнителей по проекту создания
выявить наличие прототипа, т.е. уже действующего ППП или отдельных программных модулей, реализующих некоторые функции создаваемого ПО;
разработать концепцию проектирования (выбрать модель ЖЦ ПО, технологию и стандарты проектирования, и соответствующие программные средства).
2. Планирование работ:
оценить трудовые и стоимостные затраты, сроки выполнения;
разработать план-график работ с указанием перечня работ, сроков выполнения, исполнителей работ, связанных с созданием ППП, и форму представления результатов работ;
сформулировать требования к качеству программных модулей в соответствии с условиями их функционирования и реализации конкретных функций.
3. Разработка детальных требований к ППП:
сформулировать требования к входным и выходным данным, к конфигурации технических и программных средств, в среде которых может работать проектируемый ППП;
описать требования к надежности функционирования ППП (защита информации, уровень обеспечения безопасности при сбоях в работе, возможности восстановления работоспособности);
указать требования к оформлению и содержанию технологической и эксплуатационной документации;
определить порядок контроля и приемки этапов работы, критерии завершенности разработки и начала эксплуатации.
Требования анализируются на протяжении всего времени разработки проекта. Это способствует лучшему пониманию решаемой проблемы и помогает выбрать оптимальное решение.
Результатом работы по выработке требований обычно является соответствующий документ (техническое задание на проектирование), который должен быть:
достаточным для идентификации целей ППП, его среды, преимуществ и ограничений для пользователя, состава и конфигурации ресурсов для его работы;
достаточно полным, чтобы в последующем при разработке исключить серьезные модификации и пересмотр требований;
достаточным для просмотра и утверждения руководством заказчика и разработчика на основе его реализуемости в соответствии с выбранными критериями. Проектирование
Проектирование ППП - это этап разработки высокоуровневой и детализированной модели ППП. Модель строится на основе декомпозиций требований, выработанных на предыдущем этапе и определяет структуру ППП (набор модулей), организацию модулей ППП (связи), интерфейсы и структуру данных для объединения модулей в единое целое. Высокоуровневое (внешнее) проектирование - это процесс описания планируемого поведения создаваемого ППП с точки зрения потенциального пользователя. Целью этого процесса является конкретизация внешних взаимодействий будущего ППП без детализации внутреннего устройства. Внешние спецификации ППП предназначены как для разработчиков, так и для пользователей.
При разработке внешних спецификаций необходимо стремиться к концептуальной целостности пакета, т.е. обеспечить единообразие взаимодействия с пользователем - интерфейсы всех групп пользователей пакета должны быть идентичными. Проектировщик должен решить три проблемы:
доведение до минимума ошибок пользователя;
обнаружение ошибок пользователя в случае их возникновения;
доведение до минимума сложности разрабатываемого ППП.
Фредерик Брукс, один из создателей операционной системы OS/360 для ЭВМ IBM 360/370, отмечал. «Если сразу не определена единая концепция системы, не созданы проектные спецификации («чертежи») системы, то дальнейшее развитие и сопровождение такой системы не только становится трудоемким делом, но и приводит к росту хаотичности структуры системы в дальнейшем».
Существует два основных подхода к проектированию программного обеспечения (ПО):
структурный;
объектно-ориентированный.
Подходы отличаются способом декомпозиции сложных систем. В основу структурного подхода положена функциональная декомпозиция, при которой система разбивается на функциональные подсистемы, которые, в свою очередь, делятся на подфункции, и так далее до конкретных процедур.
Основными принципами структурного подхода являются:
принцип абстрагирования - выделение существенных характеристик системы и отвлечение от несущественных;
принцип иерархического упорядочивания - организация составных частей системы в иерархические древовидные структуры;
принцип непротиворечивости - обоснованность и согласованность элементов системы;
принцип структурированности данных - данные должны быть структурированы и иерархически организованы.
Этот подход реализован, например, в методе SADT (Structured Analysis and Design Technique), в CASE-технологии Silverrun (Silverrun Technologies, Inc.). Объектно-ориентированный подход использует объектную декомпозицию, при этом статическая структура системы описывается в терминах объектов и связей между ними, а поведение системы описывается в терминах обмена сообщениями между объектами.
Основными понятиями объектно-ориентированного подхода являются объект и класс, а основными принципами:
абстрагирование - так же, как и в структурном подходе, выделение существенных характеристик объектов, отличающих его от других объектов. Выбор правильного набора абстракций для заданной предметной области представляет главную задачу объектно-ориентированного проектирования;
инкапсуляция - отделение друг от друга отдельных элементов объекта, определяющих его устройство и поведение. Инкапсуляция используется для изолирования внешнего интерфейса объекта от его внутренней реализации;
иерархия - расположение абстракций по уровням, создание ранжированных или упорядоченных структур классов и объектов;
полиморфизм - способность класса принадлежать более чем одному типу;
наследование - построение новых классов на основе существующих с возможностью добавления или переопределения данных.
Этот подход реализован во многих современных проектных технологиях, например, в семействе CASE-средств Rational Rose (Rational Software).
При структурном подходе разработка внешних спецификаций разделяется на две части: предварительный внешний проект и детальный внешний проект.
Предварительный внешний проект содержит описание основных компонентов, компонентов, из которых состоят эти основные компоненты, и далее - внешних функций (функций пользователя), составляющих отдельные компоненты проекта. Предварительный внешний проект содержит все функции пользователя, но их точный синтаксис, семантика, выходные результаты остаются неопределенными.
В процессе внешнего проектирования становятся возможными проверка правильности промежуточного уровня проекта и сопоставление его с поставленными целями. Появляется контрольная точка для руководства проектом.
Детальный внешний проект каждой функции пользователя должен включать следующую информацию:
1. Описание входных данных. Точное описание синтаксиса (формат, допустимые значения, области изменения) и семантики данных, вводимых пользователем.
2. Описание выходных данных. Точное описание результатов функции пользователя (ответы на запрос терминала, сообщения об ошибках, контрольные сигналы, отчеты). Описание функциональной связи между входными и выходными данными, чтобы специалист, читающий спецификации, мог представить себе выходные данные, получаемые из любой комбинации входных данных, как правильной, так и неправильной.
3. Преобразование системы. Многие внешние функции не только порождают выходные данные, но и изменяют состояние информационной системы, в составе которой используется ППП. Так как рассматриваются внешние спецификации, эти изменения должны быть описаны сточки зрения пользователя.
4. Характеристики надежности. Описывается влияние возможных отказов функций на систему, на файлы пользователя.
5. Эффективность. Описание ограничений, которые накладываются на эффективность функций (затрачиваемое время, занимаемая память).
6. Замечания по составу программных средств, языкам проектирования, алгоритмам процедур, операций и методам их реализации, но без детализации внутреннего устройства функции.
При завершении этапа внешнего проектирования, т.е. с момента получения детального внешнего проекта, заканчивается рассмотрение взаимодействия пользователя и ППП. Дальнейшие действия по проектированию должны быть сосредоточены на внутренней структуре ППП. В связи с этим возникает вопрос проверки внешних спецификаций на полноту и точность. На этом этапе важно обнаружить как можно больше ошибок, так как их обнаружение и внесение изменений наиболее легко выполнить, и это обходится значительно дешевле, чем на более поздних этапах разработки ППП.
Иногда в процессе работы над проектом возникает необходимость внесения изменений, что связано с обнаружением ошибок или с изменением требований.
Чтобы изменения в проекте не приводили к дополнительным ошибкам, следует соблюдать следующие правила:
1. Во время всего периода работы над проектом поддерживать документацию на уровне последних решений.
2. Фиксировать результаты каждого этапа процесса проектирования. Требования и цели фиксируются после их утверждения, внешние спецификации - после успешного завершения проверки их правильности. Изменения должны также проходить формальную процедуру утверждения.
3. Контролировать, чтобы соответствующие изменения были сделаны на всех уровнях разработки программного изделия (ПИ).
Внутреннее проектирование программного изделия начинается с изучения внешних спецификаций, разработанных на предыдущем этапе. Проверяется завершенность спецификаций программных средств, и формально выявляются все противоречия. Любые возникшие проблемы должны быть обсуждены разработчиками совместно с пользователями. К началу проектирования все спецификации должны быть согласованы с пользователями и не могут произвольно изменяться разработчиком.
Далее формируются структура программного изделия и общие правила взаимодействия компонентов.
Как отмечалось выше, программное изделие создается на основе модульно-иерархической структуры. Модуль - отдельная функционально законченная программная единица, которая может применяться самостоятельно, либо быть частью программы. Модуль характеризуется следующими тремя основными признаками:
функция - внешнее описание действий, выполняемых модулем, без указания того, как эти действия производятся;
логика модуля - внутренний алгоритм модуля, т.е. то, как модуль выполняет функцию;
контекст - конкретное использование модуля, среда его применения.
При использовании модульно-иерархической структуры:
улучшается проектирование ППП, так как сложную проблему легче понять, разбив ее на отдельные функциональные части;
улучшаются возможности оптимального использования ресурсов на разработку за счет распределения работы над модулями между программистами в соответствии с их способностями;
упрощается проведение работ по тестированию, отладке и сопровождению, так как в модулях небольшого размера легче понять логику программы, организовать проверку, оценить время, необходимое для проведения работ;
упрощается оценка текущего состояния работ. Процесс внутреннего проектирования включает анализ и декомпозицию задач и данных в соответствии с принятым методом и технологией проектирования, и завершается построением иерархической схемы, отражающей структурные взаимосвязи между всеми модулями, описанием функций каждого модуля и интерфейса между модулями, составлением спецификаций модулей.
Спецификации модулей должны содержать следующую ин- формацию:
имя модуля - указывается имя, с помощью которого можно обратиться к модулю. Для модуля, имеющего несколько входов, составляются отдельные спецификации;
функция - определяется, что делает модуль, когда он вызван, а также его назначение. Этот элемент спецификации не должен содержать сведения о том, как функция реализуется;
список входных и выходных данных - описываются входные данные и данные, возвращаемые модулем (указываются атрибуты, формат, размер, единицы измерения, а также допустимые диапазоны возможных значений всех данных). Описывается взаимосвязь между входными и выходными данными, т.е., какие выходные данные на основе каких входных данных получаются. Определяются выходные данные, возвращаемые в вызывающий модуль в случае ошибочных входных данных. Для того чтобы можно было считать модуль полностью специфицированным, должно быть определено его поведение при любых входных условиях;
внешние эффекты - дается описание внешних для программы или системы событий, происходящих при работе модуля, таких, как прием запроса, выдача сообщений об ошибках и т.п.
Спецификации модулей входят в состав технологической документации на ППП, но их также размещают и в самой программе в виде комментариев в начале текста программы модуля.
Методология, технология и инструментальные средства проектирования ПО
Методологии, технологии и инструментальные средства проектирования ПО (CASE-средства) составляют основу проекта любой информационной системы (ИС). Методология реализуется через конкретные технологии и поддерживающие их стандарты, методики и инструментальные средства, которые обеспечивают выполнение процессов ЖЦ.
CASE-средства. Общая характеристика и классификация
Современные CASE-средства охватывают обширную область поддержки многочисленных технологий проектирования ИС: от простых средств анализа и документирования до полномасштабных средств автоматизации, покрывающих весь жизненный цикл ПО.
Наиболее трудоемкими этапами разработки ИС являются этапы анализа и проектирования, в процессе которых CASE-средства обеспечивают качество принимаемых технических решений и подготовку проектной документации. При этом большую роль играют методы визуального представления информации. Это предполагает построение структурных или иных диаграмм в реальном масштабе времени, использование многообразной цветовой палитры, сквозную проверку синтаксических правил. Графические средства моделирования предметной области позволяют разработчикам в наглядном виде изучать существующую ИС, перестраивать ее в соответствии с поставленными целями и имеющимися ограничениями.
Обычно к CASE-средствам относят программное средство, автоматизирующее ту или иную совокупность процессов жизненного цикла ПО и обладающее следующими основными характерными особенностями:
мощные графические средства для описания и документирования ИС, обеспечивающие удобный интерфейс с разработчиком;
интеграция отдельных компонент CASE-средств, обеспечивающая управляемость процессом разработки ИС;
использование специальным образом организованного хранилища проектных метаданных (репозитория).
Интегрированное CASE-средство (или комплекс средств, поддерживающих полный ЖЦ ПО) содержит следующие компоненты:
репозиторий, являющийся основой CASE-средства. Он должен обеспечивать хранение версий проекта и его отдельных компонентов, синхронизацию поступления информации от различных разработчиков при групповой разработке, контроль метаданных на полноту и непротиворечивость;
графические средства анализа и проектирования, обеспечивающие создание и редактирование иерархически связанных диаграмм (DFD, ERD и др.), образующих модели ИС;
средства разработки приложений и генераторы кодов;
средства конфигурационного управления;
средства документирования;
средства тестирования;
средства управления проектом;
средства реинжиниринга.
Современные CASE-средства могут быть классифицированы в основном по типам и категориям. Классификация по типам отражает функциональную ориентацию CASE-средств на те или иные процессы ЖЦ. Классификация по категориям определяет степень интегрированности по выполняемым функциям и включает отдельные локальные средства, решающие небольшие автономные задачи (tools), набор частично интегрированных средств, охватывающих большинство этапов жизненного цикла ИС (toolkit), и полностью интегрированные средства, поддерживающие весь ЖЦ ИС и связанные общим репозиторием. Помимо этого, CASE-средства можно классифицировать по следующим признакам:
применяемым методологиям и моделям систем и БД;
степени интегрированности с СУБД;
доступным платформам.
Классификация по типам в основном совпадает с компонентным составом CASE-средств и включает следующие основные типы:
средства анализа (Upper CASE), предназначенные для построения и анализа моделей предметной области (Design/IDEF (Meta Software), BPwin (Logic Works));
средства анализа и проектирования (Middle CASE), поддерживающие наиболее распространенные методологии проектирования и использующиеся для создания проектных спецификаций (Vantage Team Builder (Cayenne), Designer/2000 (ORACLE), Silverrun (CSA), PRO-IV (McDonnell Douglas), CASE.Аналитик (МакроПроджект)). Выходом таких средств являются спецификации компонентов и интерфейсов системы, архитектуры системы, алгоритмов и структур данных;
средства проектирования баз данных, обеспечивающие моделирование данных и генерацию схем баз данных (как правило, на языке SQL) для наиболее распространенных СУБД. К ним относятся ERwin (Logic Works), S-Designor (SDP) и DataBase Designer (ORACLE). Средства проектирования баз данных имеются также в составе CASE-средств Vantage Team Builder, Designer/2000, Silverrun и PRO-IV;
средства разработки приложений. К ним относятся средства 4GL (Uniface (Compuware), JAM (JYACC), PowerBuilder (Sybase), Developer/2000 (ORACLE), New Era (Informix), SQL Windows (Gupta), Delphi (Borland) и др.) и генераторы кодов, входящие в состав Vantage Team Builder, PRO-IV и частично в Silverrun;
средства реинжиниринга, обеспечивающие анализ программных кодов и схем баз данных и формирование на их основе различных моделей и проектных спецификаций.
Вспомогательные типы включают:
средства планирования и управления проектом (SE Companion, Microsoft Project и др.);
средства конфигурационного управления (PVCS (Intersolv));
средства тестирования (Quality Works (Segue Software));
средства документирования (SoDA (Rational Software)).
Технология проектирования
Технология проектирования определяется как совокупность трех составляющих:
пошаговой процедуры, определяющей последовательность технологических операций проектирования;
критериев и правил, используемых для оценки результатов выполнения технологических операций;
нотаций (графических и текстовых средств), используемых для описания проектируемой системы.
Технологические инструкции, составляющие основное содержание технологии, должны состоять из описания последовательности технологических операций, условий, в зависимости от которых выполняется та или иная операция, и описаний самих операций.
Технология проектирования, разработки и сопровождения ИС должна удовлетворять следующим общим требованиям:
должна поддерживать полный ЖЦ ПО;
должна обеспечивать достижение целей разработки ИС с заданным качеством и в установленное время;
должна обеспечивать возможность выполнения крупных проектов в виде подсистем (т.е. возможность декомпозиции проекта на составные части, разрабатываемые группами исполнителей ограниченной численности с последующей интеграцией составных частей);
должна обеспечивать возможность ведения работ по проектированию отдельных подсистем небольшими группами (3-7 человек). Это обусловлено принципами управляемости коллектива и повышения производительности за счет минимизации числа внешних связей;
должна обеспечивать минимальное время получения работоспособной ИС;
должна предусматривать возможность управления конфигурацией проекта, ведения версий проекта и его составляющих, возможность автоматического выпуска проектной документации и синхронизацию ее версий с версиями проекта;
должна обеспечивать независимость выполняемых проектных решений от средств реализации ИС (СУБД, операционных систем, языков и систем программирования);
должна быть поддержана комплексом согласованных CASE-средств, обеспечивающих автоматизацию процессов, выполняемых на всех стадиях ЖЦ.
Применение любой технологии проектирования, разработки и сопровождения ИС в конкретной организации и конкретном проекте невозможно без выработки ряда стандартов (правил, соглашений), которые должны соблюдаться всеми участниками проекта. К таким стандартам относятся следующие:
стандарт проектирования;
стандарт оформления проектной документации;
стандарт пользовательского интерфейса.
Стандарт проектирования должен устанавливать:
набор необходимых моделей (диаграмм) на каждой стадии проектирования и степень их детализации;
правила фиксации проектных решений на диаграммах, в том числе: правила именования объектов (включая соглашения по терминологии), набор атрибутов для всех объектов и правила их заполнения на каждой стадии, правила оформления диаграмм, включая требования к форме и размерам объектов;
требования к конфигурации рабочих мест разработчиков, включая настройки операционной системы, настройки CASE-средств, общие настройки проекта;
механизм обеспечения совместной работы над проектом, в том числе: правила интеграции подсистем проекта, правила поддержания проекта в одинаковом для всех разработчиков состоянии (регламент обмена проектной информацией, механизм фиксации общих объектов), правила проверки проектных решений на непротиворечивость.
Стандарт оформления проектной документации должен уста- навливать:
комплектность, состав и структуру документации на каждой стадии проектирования;
требования к ее оформлению (включая требования к содержанию разделов, подразделов, пунктов, таблиц), правила подготовки, рассмотрения, согласования и утверждения документации с указанием предельных сроков для каждой стадии;
требования к настройке издательской системы, используемой в качестве встроенного средства подготовки документации;
требования к настройке CASE-средств для обеспечения подготовки документации в соответствии с установленными требованиями.
Стандарт интерфейса пользователя должен устанавливать:
правила оформления экранов (шрифты и цветовая палитра), состав и расположение окон и элементов управления;
правила использования клавиатуры и мыши;
правила оформления текстов помощи;
перечень стандартных сообщений;
правила обработки реакции пользователя.
Методология RAD
Одним из возможных подходов к разработке ПО является методология быстрой разработки приложений RAD (Rapid Application Development). Под этим термином обычно понимается процесс разработки ПО, содержащий три элемента:
небольшую команду программистов (от 2 до 10 человек);
короткий, но тщательно проработанный производственный график (от 2 до 6 месяцев);
повторяющийся цикл, при котором разработчики, по мере того, как приложение начинает обретать форму, запрашивают и реализуют в продукте требования, полученные через взаимодействие с заказчиком.
Команда разработчиков должна представлять из себя группу профессионалов, имеющих опыт в анализе, проектировании, генерации кода и тестировании ПО с использованием CASE-средств. Члены коллектива должны уметь трансформировать в рабочие прототипы предложения конечных пользователей.
Жизненный цикл ПО согласно методологии RAD состоит из четырех фаз:
фаза анализа и планирования требований;
фаза проектирования;
фаза построения;
фаза внедрения.
На фазе анализа и планирования требований пользователи системы определяют функции, которые она должна выполнять, выделяют наиболее приоритетные из них, требующие проработки в первую очередь, описывают информационные потребности. Определение требований выполняется в основном силами пользователей под руководством специалистов-разработчиков. Ограничивается масштаб проекта, определяются временные рамки для каждой из последующих фаз. Кроме того, определяется сама возможность реализации данного проекта в установленных рамках финансирования, на данных аппаратных средствах и т.п. Результатом данной фазы должны быть список и приоритетность функций будущей ИС, предварительные функциональные и информационные модели ИС.
На фазе проектирования часть пользователей принимает участие в техническом проектировании системы под руководством специалистов-разработчиков.
CASE-средства используются для быстрого получения работающих прототипов приложений. Пользователи, непосредственно взаимодействуя с ними, уточняют и дополняют требования к системе, которые не были выявлены на предыдущей фазе. Более подробно рассматриваются процессы системы. Анализируется и, при необходимости, корректируется функциональная модель. Каждый процесс рассматривается детально. При необходимости для каждого элементарного процесса создается частичный прототип: экран, диалог, отчет, устраняющий неясности или неоднозначности. Определяются требования разграничения доступа к данным. На этой же фазе происходит определение набора необходимой документации. После детального определения состава процессов оценивается количество функциональных элементов разрабатываемой системы и принимается решение о разделении ИС на подсистемы, поддающиеся реализации одной командой разработчиков за приемлемое для RAD-проектов время - порядка 60-90 дней. С использованием CASE-средств проект распределяется между различными командами (делится функциональная модель). Результатом данной фазы должны быть:
общая информационная модель системы;
функциональные модели системы в целом и подсистем, реализуемых отдельными командами разработчиков;
точно определенные с помощью CASE-средств интерфейсы между автономно разрабатываемыми подсистемами;
построенные прототипы экранов, отчетов, диалогов.
Все модели и прототипы должны быть получены с применением тех CASE-средств, которые будут использоваться в дальнейшем при построении системы. Данное требование вызвано тем, что в традиционном подходе при передаче информации о проекте с этапа на этап может произойти фактически неконтролируемое искажение данных. Применение единой среды хранения информации о проекте позволяет избежать этой опасности.
В отличие от традиционного подхода, при котором использовались специфические средства прототипирования, не предназначенные для построения реальных приложений, а прототипы выбрасывались после того, как выполняли задачу устранения неясностей в проекте, в подходе RAD каждый прототип развивается в часть будущей системы. Таким образом, на следующую фазу передается более полная и полезная информация.
На фазе построения выполняется непосредственно сама быстрая разработка приложения. На данной фазе разработчики производят итеративное построение реальной системы на основе полученных в предыдущей фазе моделей, а также требований нефункционального характера. Программный код частично формируется при помощи автоматических генераторов, получающих информацию непосредственно из репозитория CASE-средств. Конечные пользователи на этой фазе оценивают получаемые результаты и вносят коррективы, если в процессе разработки система перестает удовлетворять определенным ранее требованиям. Тестирование системы осуществляется непосредственно в процессе разработки.
После окончания работ каждой отдельной команды разработчиков производится постепенная интеграция данной части системы с остальными, формируется полный программный код, выполняется тестирование совместной работы данной части приложения с остальными, а затем тестирование системы в целом. Завершается физическое проектирование системы:
определяется необходимость распределения данных;
производится анализ использования данных;
производится физическое проектирование базы данных;
определяются требования к аппаратным ресурсам;
определяются способы увеличения производительности;
завершается разработка документации проекта.
Результатом фазы является готовая система, удовлетворяющая всем согласованным требованиям.
На фазе внедрения производится обучение пользователей, организационные изменения и, параллельно с внедрением новой системы, осуществляется работа с существующей системой (до полного внедрения новой). Планирование и подготовка к внедрению должны начинаться заранее, как правило, на этапе проектирования системы. Приведенная схема разработки ИС не является абсолютной. Возможны различные варианты, зависящие, например, от начальных условий, в которых ведется разработка: разрабатывается совершенно новая система; уже было проведено обследование предприятия и существует модель его деятельности; на предприятии уже существует некоторая ИС, которая может быть использована в качестве начального прототипа или должна быть интегрирована с разрабатываемой.
Следует отметить, что методология RAD, как и любая другая, не может претендовать на универсальность, она хороша, в первую очередь, для относительно небольших проектов, разрабатываемых для конкретного заказчика. Если разрабатывается типовая система, которая не является законченным продуктом, а представляет собой комплекс типовых компонент, централизованно сопровождаемых, адаптируемых к программно-техническим платформам, СУБД, средствам телекоммуникации, организационно-экономическим особенностям объектов внедрения и интегрируемых с существующими разработками, то на первый план выступают такие показатели проекта, как управляемость и качество, которые могут войти в противоречие с простотой и скоростью разработки. Для таких проектов необходимы высокий уровень планирования и жесткая дисциплина проектирования, строгое следование заранее разработанным протоколам и интерфейсам, что снижает скорость разработки.
Методология RAD неприменима для построения сложных расчетных программ, операционных систем или программ управления космическими кораблями, т.е. программ, требующих написания большого объема (сотни тысяч строк) уникального кода. Не подходят для разработки по методологии RAD приложения, в которых отсутствует ярко выраженная интерфейсная часть, наглядно определяющая логику работы системы (например, приложения реального времени) и приложения, от которых зависит безопасность людей (например, управление самолетом или атомной электростанцией), так как итеративный подход предполагает, что первые несколько версий наверняка не будут полностью работоспособны, что в данном случае исключается. Оценка размера приложений производится на основе так называемых функциональных элементов (экраны, сообщения, отчеты, файлы и т.п.) Подобная метрика не зависит от языка программирования, на котором ведется разработка. Размер приложения, которое может быть выполнено по методологии RAD, для хорошо отлаженной среды разработки ИС с максимальным повторным использованием программных компонентов, определяется следующим образом: менее 1 000 функциональных элементов - один человек; 1 000-4 000 функциональных элементов - одна команда разработчиков; более 4 000 функциональных элементов - из расчета 4 000 функциональных элементов на одну команду разработчиков.
Отметим основные принципы методологии RAD:
разработка приложений итерациями;
необязательность полного завершения работ на каждом из этапов жизненного цикла;
обязательное вовлечение пользователей в процесс разработки ИС;
необходимое применение CASE-средств, обеспечивающих целостность проекта;
применение средств управления конфигурацией, облегчающих внесение изменений в проект и сопровождение готовой системы;
необходимое использование генераторов кода;
использование прототипирования, позволяющее полнее выяснить и удовлетворить потребности конечного пользователя;
тестирование и развитие проекта, осуществляемое одновременно с разработкой;
ведение разработки немногочисленной, хорошо управляемой командой профессионалов;
грамотное руководство разработкой системы, четкое планирование и контроль выполнения работ.
Инструменты разработки программных средств
При разработке программных средств используется, в той или иной мере, компьютерная поддержка процессов разработки и сопровождения ПО. Это достигается путем представления некоторых программных документов ПО (прежде всего, программ) и предоставлению в распоряжение разработчика ПО специальных программных средств (ПС), или включенных в состав компьютера специальных устройств, созданных для какой-либо обработки таких документов. В качестве такого специального ПС можно указать компилятор с какого-либо языка программирования. В качестве специального устройства, поддерживающего процесс разработки ПО, можно указать, например, эмулятор какого-либо языка. ПС, предназначенное для поддержки разработки ПО, будем называть программным инструментом разработки ПО, а устройство компьютера, специально предназначенное для поддержки разработки ПО, будем называть аппаратным инструментом разработки ПО.
Инструменты разработки ПО могут использоваться в течение всего жизненного цикла ПО для работы с разными программными документами. Так, текстовый редактор может использоваться для разработки практически любого программного документа. С точки зрения функций, которые инструменты выполняют при разработке ПО, их можно разбить на следующие четыре группы:
редакторы;
анализаторы;
преобразователи;
инструменты, поддерживающие процесс выполнения программ.
Редакторы поддерживают конструирование (формирование) программных документов на различных этапах жизненного цикла. На этапе программирования (кодирования) вместо текстового редактора может оказаться более удобным синтаксически управляемый редактор, ориентированный на используемый язык программирования.
Анализаторы производят либо статическую обработку документов, осуществляя различные виды их контроля, выявление определенных свойств и накопление статистических данных (например, проверку соответствия документов указанным стандартам), либо динамический анализ программ (например, с целью выявление распределения времени работы программы по программным модулям).
Преобразователи позволяют автоматически приводить документы к другой форме представления (форматеры) или переводить документ одного вида к документу другого вида (например, конверторы или компиляторы), синтезировать какой-либо документ из отдельных частей и т.п.
Инструменты, поддерживающие процесс выполнения программ, позволяют выполнять на компьютере описания процессов или отдельных их частей, представленных в виде, отличном от машинного кода, или машинный код с дополнительными возможностями его интерпретации. Примером такого инструмента является эмулятор кода другого компьютера. К этой группе инструментов следует отнести и различные отладчики. Программирование
Спецификации модулей можно рассматривать как технические задания группам программистов на кодирование (программирование) внутренней логики каждого модуля.
Этот процесс состоит из следующих действий:
изучение спецификации модуля - проверяется правильность, понятность и внутренняя непротиворечивость информации;
выбор языка программирования, если это не сделано на этапе выработки требований к ППП. Использование того или иного языка программирования часто предопределено имеющимися у заказчика вычислительными ресурсами (для заказного ППП), принятыми у разработчика стандартами, уровнем квалификации программистов;
выбор алгоритма и структуры данных - выполняя оригинальные разработки, или используя опыт предыдущих работ;
собственно программирование;
компиляция (трансляция) модуля - это действие означает переход к тестированию модуля. Компилятор, строя машинную программу, проводит проверку правильности синтаксиса и частично семантики исходной программы.
Большое влияние на качество создаваемой программы оказывает стиль программирования (правила, приемы, формы программирования, которые, в принципе, являются общими, независимыми от конкретного алгоритмического языка). Стилю программирования посвящено немало замечательных книг, например, «Стиль, разработка, эффективность, отладка и испытание программ» Д. Ван Тассела. Под фактором хорошего стиля программирования автор, прежде всего, понимает простоту и «удобочитаемость» программы (реализация знаменитого KISS принципа: Keep It Simple, Stupid! - Делай проще, глупец!). В частности, он отмечает: «Начинающие программисты думают, что они пишут программы для машин. Опытные программисты знают, что пишут программы для людей».
Другим фактором, в некоторой степени определяющим первый, является использование идей структурного программирования, которые соответствуют общим принципам структурного подхода:
разбиение задачи на ряд небольших подзадач;
широкое применение стандартных подпрограмм;
использование простых логических программных структур: линейной (например, операторы присваивания), ветвления (например, оператор ЕСЛИ) и циклической (например, оператор DO).
И, конечно же, знание особенностей и нюансов используемого языка программирования.
Переход к спиральной модели жизненного цикла ППП привел к появлению экстремального программирования (ХР - extremely Programming), как стилю и методу современного программирования.
Основные принципы ХР - это достаточно простые и здоровые идеи, применяемые в экстремальных ситуациях:
стремиться к простоте (все тот же KISS принцип);
создавать код небольшими итерациями и работать так, чтобы как можно быстрее выдать готовый продукт;
двигаться вперед по мере конкретизации стоящих перед вами задач (не тратить время на создание чего-то грандиозного и всеобъемлющего);
рассматривать модульное и функциональное тестирование как важнейшую часть проекта, а не как необязательное дополнение;
работать напрямую с потребителями и пользователями, стремясь превратить их в участников группы разработки;
сделать так, чтобы каждый из причастных к проекту ощущал себя ответственным за него, но в то же время не допускать, чтобы тот или иной специалист становился единственным экспертом в какой-то определенной части проекта;
стимулировать постоянную переработку кода (то есть переписывание и совершенствование программ).
ХР предполагает изменение методов работы программистов. Более того, оно основано на новой философии разработки программ - парном программировании. Парное программирование - это, возможно, самый спорный аспект ХР. Этот метод предполагает, что два программиста на одном и том же компьютере пишут текст программы и, тем самым, сокращается вероятность создания ошибочного кода.
На первый взгляд кажется неразумным таким образом объединять двух программистов, ведь работая по отдельности, они могут написать в два раза больше. Но, по мнению сторонников ХР, отягощение цикла разработки компенсируется гласностью, благодаря которой максимум разработчиков имеют возможность познакомиться с текстом программы. Конечно, кто-то будет лучше разбираться в одной области, кто-то в другой, но вы никогда не станете заложником не вполне вменяемого, хотя и супер талантливого программиста, который один знает, как работает конкретная часть кода.
Как начинается проект разработки для парного программирования? В рамках модели ХР большая часть работы над проектом формулируется с помощью карт CRC (Class, Responsibility, Collaboration - «класс, обязанности, сотрудничество») - листов бумаги представляющих собой объекты данного проекта.
Перед началом проекта рабочая группа проводит встречи, на которых моделируются взаимосвязи всех известных объектов, причем карты CRC используются для наглядности. Программистам приходится обсуждать аспекты, вызывающие наибольшие сомнения, и убирать или добавлять новые карты, чтобы отразить изменения в плане. Описывая объекты как отдельные сущности, сложные концепции можно упростить, превратив их в понятную структуру.
Результатом этапа CRC становится список небольших задач. Разработчики разбиваются на пары, и каждая пара определяет модульный тест для выделенной ей задачи. Следует отметить, что такие тесты создаются до того, как начинается сам процесс кодирования. По словам сторонников ХР, такой подход упрощает и ускоряет разработку приложений. Тесты при этом пишутся более аккуратно, поскольку они служат для проверки критически важной функциональности, кроме того, улучшается обратная связь, позволяющая точно определить, что именно требуется сделать. Иными словами, отпадает необходимость тратить время на создание огромных тестов для проверки работоспособности проекта в целом.
Затем каждая пара разработчиков приступает к кодированию в соответствии со спецификациями поставленной перед ней задачи. Высококвалифицированный программист всегда работает в паре с менее опытным разработчиком. Первый следит за грамотностью кода, то есть за синтаксисом и корректностью конструкций, а последний отвечает за общую логику проекта и должен отслеживать ошибки.
Как только код, реализующий решение задачи, за которое отвечала та или иная пара, завершен, запускается определенный ранее тест. Если тестирование завершается успешно, код интегрируется в репозиторий (хранилище), где к нему могут обращаться все члены группы разработчиков. Измененный код должен помещаться в репозиторий каждые несколько часов (по крайней мере, раз в сутки). При этом все разработчики будут получать актуальный код. Такой подход снижает вероятность возникновения в проекте ошибок, связанных с нестыковкой версий.
Если в процессе написания кода партнеры приходят к выводу, что им требуется помощь в решении конкретного вопроса, они могут обратиться с просьбой, сформировать новую пару для выполнения данной задачи. Обычно один из программистов первой пары присоединяется к другой команде, а второй вместе с новым разработчиком продолжает решение возникшего вопроса.
Последний шаг - выполнение всех модульных и функциональных тестов. Вполне вероятно, что этот процесс придется повторить несколько раз, пока не удастся достичь корректной работы и взаимодействия всех объектов. Может понадобиться провести несколько CRC-сессий; объекты, не прошедшие функциональное тестирование, должны быть переданы для доработки другой паре программистов.
Сторонники ХР исходят из того, что если уж проект обречен на неудачу, то лучше признать это сразу и уберечь себя от бессмысленной траты времени и средств. Вместо того, чтобы не покладая рук трудиться над всеобъемлющей спецификацией программы, а затем выше головы загрузить своих программистов на полгода; разработчики, придерживающиеся методологии ХР, создают программы путем небольших итераций и пишут самый простой работоспособный код. При таком подходе нет необходимости заниматься предупреждением ошибок, которые могут никогда не возникнуть, или вводить возможности, которые никогда не потребуются.
Проекты должны разрабатываться по этапам, продолжительность которых составляет от недели до трех. При этом можно сформировать долгосрочный план, но не надо тратить время на тщательную проработку деталей. Идея состоит в том, чтобы добиться максимальной гибкости в процессе проектирования. Если архитектура строилась исходя из неверных предпосылок, время будет упущено, и, что еще хуже, вы станете заложником новой архитектуры. Точно так же не стоит проектировать и создавать код в расчете на многократное использование, если непонятно, есть ли для этого основания. Скептики могут заявить, что если архитектура слишком сильно отличается от исходных спецификаций, это уже серьезно угрожает проекту. Однако сторонники ХР утверждают, что приложения редко выглядят так, как указано в первоначальных спецификациях, и совершенно неразумно отказываться от преимуществ, которые дает гибкость.