Изложение материала строится на основе классической модели зрелости способностей CMM/CMMI Института технологии программирования (Software Engineering Institute), описывающей процесс разработки программных продуктов. В конце каждого раздела приводятся вопросы и задания для самоконтроля за усвоением материала, предлагавшиеся студентам как контрольные задания.
Раздел 1 описывает жизненный цикл разработки в форме программного проекта для ролевой модели «Заказчик-Исполнитель», типичные деятельности, которые должны при этом исполняться в свете сложившихся в промышленности лучших практик, положенных в основу моделей CMM/CMMI зрелости способностей разработчика.
Раздел 2 рассматривает обобщенный каркас производственного технологического процесса по разработке программного продукта с акцентом на его фазы планирования и сбора и анализа требований.
Раздел 3 дает краткое введение в модели зрелости способностей CMM/CMMI Института технологии программирования. Описываются 18 ключевых областей процесса разработки для CMM и 22 области процесса для CMMI и дается их сравнительный анализ.
Раздел 4 рассматривает настолько важный аспект в разработке программного продукта – анализ рисков и управление рисками в программном проекте, что в модели CMMI он даже выделен в отдельную процессную область.
Раздел 5 посвящен требованиям стандартов качества ISO 9000 применительно к разработке программного обеспечения. Рассматривается модель процессов ISO и связанные с этим методики самооценивания разработчиком степени своего соответствия этим стандартам ISO.
Раздел 6 рассматривает современных подходы к применению формальных математических методов в промышленной разработке программного продукта, включая создание и верификацию его формальной модели и автоматизированного порождения тестового набора для исчерпывающего тестирования его реализации с заданным критерием тестового покрытия.
Раздел 7 рассматривает некоторые общие технологические приемы, полезные не только в программных проектах, но и других видах инженерной деятельности.
Раздел 8 посвящен специфическим для авиации требованиям к сертификации программного обеспечения и базовое для этого ПО понятие уровня безопасности компонентов ПО. Там рассматриваются те же базовые процессы (с добавлением процесса контакта с государственным органом сертификации, которого нет в моделях CMM/CMMI) с позиций сертификации ПО, как она определена в стандартах DO-178B, ED-12B и КТ-178В, и даются практические рекомендации по организации процесса создания ПО для авиационных систем и оборудования в расчете на его последующую сертификацию по требованиями упомянутых стандартов.
В разделе 9 приводятся темы для самостоятельных исследований и курсовых работ, предлагавшиеся в разное время студентам по курсу «Технология программирования».
Приложения содержат шаблоны некоторых основных документов, создаваемых в ходе промышленной разработки программного продукта и используемых для его сертификации.
Сокращение |
Расшифровка |
API |
Application Programming Interface – Программный интерфейс приложения |
ASM |
Abstract State Machines – Язык абстрактных автоматов |
CASE |
Computer-Aided Software Engineering – Автоматизированная разработка программ |
CDMA |
Code Division Multiple Access – Множественный доступ с кодовым разделением каналов (один из двух стандартов для цифровых сетей сотовой связи в США ) |
CMM |
Capability Maturity Model – Модель зрелости способностей |
CMMI |
Capability Maturity Model Integrated – Интегрированная модель зрелости способностей |
COCOMO |
COnstructive COst MOdel – Конструктивная модель издержек |
COPQ |
Cost Of Poor Quality – Лишние затраты из-за ошибок |
COQ |
Cost Of Quality – Затраты на обеспечение качества |
COTS |
Commercial Off The Shelf – Готовый коммерческий продукт «с полки» |
CPM |
Critical Path Method – Метод критического пути |
CPN |
Colored Petri Nets – Раскрашенные сети Петри |
CRR |
Comparative Risk Ranking – Сравнительное ранжирование рисков |
CVS |
Control Version System – Система версионного контроля |
DT&E |
Development Test and Evaluation – Тестирование и оценивание разработки |
EASA |
European Aviation Safety Agency – Европейское агентство по авиационной безопасности |
EAV |
Economic Added Value – Экономическая добавленная ценность |
EMV |
Expected Monetary Value – Ожидаемая ценность в денежном выражении |
ESI |
Educational Services Institute – Институт образовательных услуг |
EUROCAE |
European Organization on Civilian Aviation Electronics – Европейская организация по электронике в гражданской авиации |
FAA |
Federal Aviation Administration – Федеральная авиационная администрация |
GUI |
Graphical User Interface – Графический пользовательский интерфейс |
IDE |
Integrated Development Environment – Интегрированная среда разработки |
IE |
Information Engineering – Информационная инженерия |
IEC |
International Electrotechnical Commission – Международная комиссия по электротехнике |
IPPD |
Integrated Product and Process Development – Интегрированная разработка продукта и процесса |
ISO |
International Organization of Standardization – Международная организации по стандартизации |
JAD |
Joint Application Design – Инструмент для проектирования приложений |
KAELOC |
K Assembler Equivalent Lines Of Code – Тысячи строк кода, эквивалентных ассемблерным |
KLOC |
K Lines Of Code – Тысячи строк кода |
KPA |
Key Process Area – Ключевая область процесса |
LC |
Life Cycle – Жизненный цикл |
LCC |
Life Cycle Cost – Стоимость жизненного цикла |
LTL |
Linear Temporal Logic – Линейная темпоральная логика |
MSC |
Message Sequence Charts – Диаграммы следования сообщений |
PDM |
Precedence Diagram Method – Метод диаграмм предшествования |
PERT |
Program (or Project) Evaluation and Review Technique – Методика оценивания и обзора программы (или проекта) |
PMI |
Project Management Institute – Институт управления проектами |
POTS |
Plain Old Telephone System – Простая старая телефонная система |
RAD |
Rapid Application Development – Быстрая разработка приложений |
RFP |
Request For Proposal |
ROA |
Return On Assets – Доходность активов |
ROI |
Return On Investments – Возврат инвестиций |
ROS |
Return On Sales – Доходность продаж |
RS |
Requirements Specification – Спецификация требований |
RTCA |
Radio Technical Committee on Aviation – Радиотехнический комитет по авиации |
RUP |
Rational Unified Process – Единый процесс фирмы Rational |
SC |
Special Committee – Специальный комитет |
SDL |
Specification Description Language – Язык описания спецификаций |
SE |
System Engineering – Разработка систем |
SEI |
Software Engineering Institute – Институт технологии программирования |
SLIM |
Software LIfe Management – Управление жизненным циклом программного продукта |
SOW |
Statement Of Work – Положение о работе |
SPMP |
Software Project Management Plan – План управления программным проектом |
SQA |
Software Quality Assurance – Обеспечение качества ПО |
SS |
Supplier Sourcing – Работа с поставщиками |
SW |
Software engineering – технология программирования |
SWOT |
Strengths, Weaknesses, Opportunities, Threats – сильные стороны, слабые стороны, возможности, угрозы |
TBD |
To Be Defined – Еще предстоит определить |
TCM |
Test Coverage Matrix – Матрица тестового покрытия |
UCM |
Use Case Maps – язык пользовательских сценариев |
UFADM |
Unified Framework for Application Development Management – Единый каркас для управления разработкой приложений |
UML |
Unified Modeling Language – Единый язык моделирования |
V&V |
Verification and Validation – Верификация и валидация |
WBS |
Work Breakdown Structure – Структура разбиения работ |
WG |
Working Group – Рабочая группа |
XML |
Extended Markup Language – Расширенный язык разметки |
АРМ |
Автоматизированное рабочее место |
БД |
База данных |
ГОС |
Государственный орган сертификации |
ЕСКД |
Единая система конструкторской документации |
ЕСПД |
Единая система программной документации |
ЖЦ |
Жизненный цикл |
НИИ |
Научно-исследовательский институт |
ОКР |
Опытно-конструкторские работы |
ПО |
Программное обеспечение |
ПИ |
Программное изделие |
САПР |
Система автоматизированного проектирования |
СВЧ |
Сверхвысокая частота |
ТЗ |
Техническое задание |
Профессиональная разработка программного продукта (software product development) обычно осуществляется в рамках какого-либо программного проекта (software project), представляющего собой вид производственной экономической деятельности, в результате которой создается данный программный продукт. Известно несколько ролевых моделей, в рамках которых программные проекты выполняются.
Ролевая модель «Заказчик-исполнитель» называется так потому, что в ней явно определены роли, указанные в ее названии. Заказчик (customer) формирует основные исходные требования для программного продукта, финансирует его разработку и осуществляет приемку готового продукта, как правило, с отчуждением продукта от исполнителя и среды разработки, а исполнитель (developer) лишь выполняет разработку с достижением определенного уровня удовлетворенности ее результатом со стороны заказчика. Все права на такой программный продукт, включая все его промежуточные рабочие продукты, как правило, принадлежат заказчику, а исполнитель лишь получает оговоренную плату за выполненную работу при ее успешном завершении.
В ролевой модели «Инициативная разработка для неопределенного круга пользователей» нет явного заказчика; исходные требования к конечному продукту формирует сам исполнитель, исходя из собственного представления о будущих пользователях (users) и их потребностях в данном программном продукте. Права на такой рабочий продукт остаются у исполнителя, который может предоставлять лицензию на использование продукта желающим пользователям на определенных условиях, не обязательно включающих плату за пользование. В этой модели предполагается роль «спонсора проекта» (project sponsor); им обычно является какой-либо распорядитель бюджета, который принимает решение о финансовой поддержке проекта и его сроках, а также является последней инстанцией в разрешение конфликтных ситуаций в проекте.
Ролевая модель «Разработка продукта для внутреннего использования» предполагает использовать создаваемый программный продукт исключительно самим исполнителем без последующего отчуждения программного продукта. В силу этого обстоятельства исполнитель сам определяет требования к продукту, финансирует его разработку (как правило, в расчете на оптимизацию каких-то собственных производственных процессов) и сохраняет все права на него. Как и в ролевой модели «Инициативная разработка для неопределенного круга пользователей», здесь существенна роль спонсора проекта.
Существуют и другие ролевые модели, включающие особенности перечисленных трех моделей в той или иной комбинации. Из всех известных моделей наиболее простой является ролевая модель «Заказчик-исполнитель», на которую и будет ориентироваться все дальнейшее изложение.
Часто программный проект характеризуют размером создаваемого в нем продукта (большой, средний, небольшой) и его сложностью (проект высокой, средней или низкой сложности). Проект считается большим, если в нем нужно разработать более 50 тысяч строк кода (KLOC – K Lines Of Code, причем пустые строки или строки, содержащие только комментарии, не учитываются) и(или) более различных 50 интерфейсов с пользователем и(или) другими системами, если для него нужны разработчики со стажем работы не менее 5 лет, или если требуется применить какие-либо инновационные технологии или новое ПО. Для небольшого проекта все эти требования противоположны, а проект среднего размера занимает некоторое промежуточное положение. Существует ряд инструментов, подсчитывающих размер проекта, а многие трансляторы с языков программирования имеют эту функциональность как встроенную.
Если разные компоненты программного продукта создаются на разных языках программирования, то размер этого продукта определяется в KAELOC – K Assembler Equivalent Lines Of Code, а для пересчета KLOC в KAELOC используются переходные коэффициенты, эмпирически установленные для разных языков программирования (Табл. 1). С помощью этих же коэффициентов можно сравнивать программные продукты, написанные на разных языках.
Табл. 1. Пересчет KLOC в KAELOC
Язык программирования |
Коэффициент пересчета |
|
Язык программирования |
Коэффициент пересчета |
Ada |
4,5 |
|
LISP |
1,5 |
Assembler |
1,0 |
|
Macro-Assembler |
1,0 |
C |
2,5 |
|
Pascal |
3,5 |
C++ |
11,0 |
|
Query languages |
25,0 |
Forth |
5,0 |
|
Unix shell scripts |
1,5 |
FORTRAN |
3,0 |
|
4-th Generation Languages |
16,0 |
На сложность проекта могут быть индивидуальные точки зрения, но обычно заказчик и исполнитель быстро приходят к единому мнению по поводу этой его характеристики. Среди факторов, повышающих сложность проекта, обычно называют наложение фаз разработки, наличие субподрядчиков, географическую разобщенность исполнителей, включая их взаимодействие из разных стран, разработку встроенного ПО и совместную разработку аппаратуры и ПО.
Известными формальными критериями сложности программного продукта (программы) являются статические словарные и топологические группы метрик, а так же их комбинации и производные от них.
Исторически первой группой метрик сложности стала сложность по Холстеду (Maurice Halstead) [17], основанная на подсчете числа вхождений в текст программы двух видов программных единиц: операторов и операндов, по которым определяются следующие четыре базовых метрики:
η1 – размер словаря операторов – число различных операторов языка программирования, включая символы-разделители, имена процедур и знаки операций, встречающихся в тексте программы;
η2 – размер словаря операндов – число различных операндов, включая имена переменных и обозначения констант, встречающихся в тексте программы;
N1 – общее число всех операторов в программе;
N2 – общее число всех операндов в программ,
по которым определяются размер словаря данной программы: η = η1 + η2 и длина данной ее реализации: N = N1 + N2.
Холстед установил связь между размером словаря и длиной реализации:
N ≈ Ñ =
причем на представительной выборке текстов программ коэффициент корреляции реальной длины N с указанной оценкой Ñ составил 98%.
Другой важной и содержательной метрикой, введенной в рассмотрение Холстедом, был объем программы в битах: V = N log2 η, поскольку log2 η – это минимальное число бит, необходимое для различимого представления всех ее программных единиц. Введено также понятие потенциального объема программы V* для выражения данной программы в максимально сжатой форме в «идеальном языке», где все необходимые операторы уже имеются или определены в виде процедуры или подпрограммы. Для такой формы представления программы требуется знать только имена операндов для аргументов и результатов таких операторов. Отметив соответствующие базовые метрики в таком представлении звездочками, получаем, что
Поскольку в минимальном «идеальном
языке» всего 2 типа операторов (вызов
функции или процедуры и оператор
присваивания) и ни операторы, ни операнды
не требуют повторений , то
и указанное уравнение сводится к:
где
представляет собой число различных
входных и выходных параметров программы.
Таким образом, V*
не зависит от языка, на котором написана
программа и является разумной мерой ее
«содержательности».
Используя введенные понятия, можно определить «уровень» конкретной реализации программы, зависящий от языка программирования:
L*=
который равен 1 только для максимально «сжатых» реализаций; при увеличении объема программы уровень уменьшается и наоборот.
Холстед также вводит «интеллектуальное содержание» программы: I= L*×V , которое может быть оценено непосредственно, исходя из базовых метрик программы:
и который приблизительно равен ее потенциальному объему V* и, таким образом, не зависит от языка программирования.
Поскольку с увеличение потенциального объема V* уровень программы L уменьшается в том же отношении, то их произведение λ=L×V* остается неизменным для всех программ на данном языке программирования, и поэтому его принято называть уровнем данного языка программирования.
Табл. 2. Метрики сложности программы по Холстеду
Название метрики |
Формула для подсчета |
длина программы |
N = η1 × log2 η1 + η2 × log2 η2 |
объем программы |
V = N × log2 η |
оценка длины реализации программы |
L* = (2 × n2 )/ (n1 × N2) |
уровень языка программирования |
λ=L×V* |
интеллектуальное содержание программы |
I= L*×V |