Технологии разработки программного обеспечения (ПО) появились вместе с программированием. Стало традицией совмещение двух процедур: как написать алгоритм о том, «как писать программу» и разработать этот проект, уточнив по ходу дела первый алгоритм. Если программу «исполняет» компьютер, то технологию написания программ «исполняет» человек.
Для компьютера ошибка в цикле исполнения чревата фатальными последствиями. Для человека процесс исполнения технологии написания программ - это не цикл и не алгоритм, а спираль развития знаний и умений формализовать область применения, сформулировать задачу и решить ее.
Область применения и цель в ней
Программирование в любом контексте - это формализация знаний и умений разработчика (коллектива) в относительно точный алгоритм, записанный в формате технического задания (ТЗ) на разработку программного обеспечения (ПО) одной или множества программ.
Область применения всегда первична. Задача, которую надлежит решить, не столько вторична, сколько трудно определяема и сама по себе является задачей. Понять, что нужно сделать так, чтобы сделать это быстро и точно, всегда сложно. Все попытки формализовать процесс и создать универсальный пример технического задания на разработку программного обеспечения всегда оборачивались спиральным движением к цели.
Формулировка задачи всегда уточнялась, цель конкретизировалась, а требуемая функциональность порой определялась годами.
Построить космический корабль, спроектировать жилой дом или написать ТЗ на атомный подводный корабль - годы работы даже с учетом опыта многочисленных специалистов. Это понятно всем.
Общественное сознание с большим трудом приходило к пониманию того, что написать программу (программную систему) - это не меньший, а часто гораздо более трудоемкий и сложный процесс.
Определить пространство решений
Область применения всегда «знает» что именно нужно сделать, чтобы изменить ситуацию к лучшему, но специалист не сразу понимает, как это корректно сформулировать и реализовать.
Современное программирование ушло из локального варианта в сетевой «распределенный» контекст. Сути это не изменило. Что взять за основу C#, C/C++ или комплект интернет-технологий HTML/CSS + JavaScript/PHP не имеет значения.
Можно создать уникальное ПО на ассемблере для любой области применения, но это очень трудоемкий процесс работы высококвалифицированных специалистов на уровне машинного кода.
Программное обеспечение - это воплощение мыслительной деятельности специалиста в статическом, осязаемом варианте. Требуемая функциональность формализуется в логику диалога, алгоритмы решений и интерфейс.
Пространство решений - это необходимый функционал, который описывает идею или обеспечение исполнения спектра требований, улучшающих работу пользователя (заказчика, потребителя ПО) в области применения.
Техническое задание на разработку программного обеспечения в конечном итоге - это логика формализации предметной области для постановки задачи, а также процедуры описания, разработки, внедрения сопровождения, обновления и условия прекращения пользования информационных систем, предназначенных для накопления, хранения и обработки данных посредством компьютерного оборудования.
Информационная система - обобщенное обозначение отдельной программы, комплекса программ, базы данных или уникального алгоритма. Всегда есть что-то на входе, что-то на выходе и нужно построить то, что стоит между входом и выходом - программное обеспечение: формализовать и реализовать процедуру обработки информации.
Участники процесса и важные условия
Заказчик - физическое или юридическое лицо, заинтересованное в разработке информационной системы.
Исполнитель - физическое или юридическое лицо, способное организовать процесс и изготовить информационную систему.
Разработчик (коллектив) - специалист или группа специалистов, нанимаемая для выполнения всех или части работ.
Отношения при разработке информационной системы строятся на уровне Заказчик - Исполнитель: только письменная форма согласно действующего законодательства и заключенного договора.
Исполнитель - разработчик: только письменная форма согласно собственного руководства или общего ГОСТ на техническое задание на разработку программного обеспечения.
Никаких устных отношений не допускается (не запрещено, но не рекомендуется), никакой участник процесса не может ссылаться на договоренности, не подтвержденные письменно.
Заказчик и Исполнитель действуют в пределах действующего законодательства и заключенного договора до полного исполнения обязательств.
Разработчик нанимается на работу Исполнителем по мере необходимости для исполнения конкретных функций, задач, этапов. Определение компетенции и состава группы разработки - сфера интересов и ответственности Исполнителя.
Особенности ТЗ на разработку ПО
Предельная ясность! ТЗ - это строгий документ, четко определяющий что и на каком основании было формализовано:
- исходные данные;
- требуемые результаты и выходные данные;
- обоснование и перечень всех алгоритмов, подлежащих реализации.
ТЗ - самодостаточный документ: если исполнить все, что в нем написано то требуемая функциональность будет реализована, а задача - решена. Ничего постороннего, ничего противоречивого. Все пункты технического задания на разработку программного обеспечения взаимосвязаны, систематизированы и точно сформулированы.
Любое ТЗ на разработку (даже самой неказистой программы) - динамичный документ. Нельзя его фиксировать как нечто незыблемое. В программировании интеллект отражается как в зеркале. ТЗ - это процесс спиралевидного развития представлений об области применения и решаемой задаче.
Техническое задание на разработку программного обеспечения - это не карандаш и лист бумаги, а шариковая (чернильная) ручка и пачка испорченной бумаги.
Достойны уважения те разработчики, которые при написании ТЗ ориентируются на сохранение истории развития своих представлений об области применения и решаемой задаче.
Концептуальное представление об информационных системах
Техническое задание на разработку программного обеспечения как образец концептуальных представлений об алгоритме, программе, информационной системе, базе данных, веб-ресурсе или ином изделии, работающем на цифровом вычислительном устройстве, ориентируется на язык программирования, но конкретизация и выбор языка - не принципиальны.
Все что разрабатывается (программируется) для управления цифровым вычислительным устройством - это информационная система (ПО, алгоритм, программа или база данных).
Информационная система - это:
- результат формализации области применения;
- постановка задачи для разработки алгоритма (системы алгоритмов);
- программирование (разработка);
- тестирование (проверка функциональности и наличия ошибок);
- внедрение (адаптация к области применения и доработка);
- сопровождение (обслуживание без изменения кода);
- обновление (модернизация, создание новой версии);
- прекращение эксплуатации (юридическое, техническое, плановое).
Информационная система - это последовательность трансформации мыслительной деятельности человека:
- общее системное представление;
- формальное описание;
- конкретная разработка;
- система проверки функциональности;
- система внедрения;
- система сопровождения;
- система обновления (модернизации);
- основания и причины для прекращения использования.
Разработку информационной системы выполняет Исполнитель силами собственных или привлеченных специалистов. Авторское право и право собственности в процессе работы на результаты этапов оформляется согласно законодательству и по договоренности с заказчиком.
Развитие ТЗ при разработке ПО
Использование коллектива специалистов, замена специалистов, время и логика выполнения работ определяется Исполнителем. Функции Заказчика заканчиваются на этапе постановки задачи, до внедрения информационной системы и вновь начинаются после внедрения.
Разработка осуществляется циклически, но по спирали:
- после тестирования (инициатива Исполнителя);
- после внедрения (инициатива Заказчика);
- при объективной необходимости обновления.
Разработка информационной системы ориентируется на результат мыслительной деятельности человека, который трансформируется из концептуального описания области применения в конкретное изделие.
Каждый этап трансформации строится таким образом, чтобы максимально избежать жесткости конечных конструкций, обеспечить динамичное уточнение каждого элемента, данного, объекта, функции и пр. конечного изделия в процессе разработки.
Разработка технического задания на создание программного обеспечения и созданная информационная система являются статичными представлениями о результатах выполненной работы, воспринимаются как есть, допущенные неточности, ошибки и изъяны конструкции не могут быть основанием для обоснования или предъявления какого-либо ущерба.
Развитие ПО на базе уже созданных решений
ПО используется во многих случаях в различных областях применения давно и накоплен большой опыт. Финансы, биржи, бухгалтерские решения, электронный документооборот, станки с числовым программным управлением и другие сферы.
Написать техническое задание на разработку программного обеспечения С1 - пример работы, которая формализуется на основании уже существующего ПО. Очень характерно, что бухгалтерия 1С, заявленная разработчиками как первая и единственная реализация комплексного бухгалтерского ПО была создана другими коллективами разработчиков в совершенно других программных продуктах. Совершенно очевидно, что существующие бухгалтерские программы не идеал и будут развиты существующие и созданы новые.
Актуальность и реальная потребность в автоматизации производств и обработку информации сделала техническое задание на разработку программного обеспечения АИС независимым продуктом мыслительной деятельности специалиста.
В отличии от 1С, работы по проектированию ТЗ для АИС и собственно самих автоматизированных информационных систем датируются началом 80-х годов прошлого века, но проблем от этого не стало меньше, а идей стало гораздо больше.
Развитие и динамика против классики и статики
Любая программа фиксирует знания и умения разработчиков (авторов). Заказчики и руководители программных проектов могут вносить свою лепту в ТЗ и результирующее ПО, но конкретные программисты по-прежнему переносят свои мысли (знания и умения) в статичный программный код. Даже когда программа может динамично адаптироваться к изменениям в области применения, современные технологии программирования не дают ей возможности выйти за пределы представлений программистов, за пределы выполненной реализации (решения) поставленной задачи.
Если ограничения современных информационных технологий определить, как фундаментальный фактор, то процесс создания ТЗ и результирующего ПО будет выглядеть как постепенное наращивание функционала.
Программирование - это не единичный факт: написано ТЗ, создано ПО и процесс завершен. Иной вариант: написано, сделано и начали все сначала. Идеально - не столько писать программу и уточнять как именно это делать, а формировать коллектив разработчиков программы и совершенствовать его знания и умения.