Программная инженерия — это специфический тип деятельности по разработке и применению обоснованных инженерных методик для экономного формирования программного обеспечения, надёжно работающего на реальных компьютерах.
Введение
Под программной инженерией или иначе промышленным программированием как правило понимается разработка больших и сложных программных продуктов коллективом программистов. Появление и развитие данной сферы деятельности было обусловлено проблемами, сопряжёнными со значительной ценой программного обеспечения, сложным процессом его формирования, необходимостью управлять процессами его проектирования, а также необходимостью прогнозировать исход данных процессов.
В шестидесятых и семидесятых годах двадцатого века случилось событие, вошедшее в историю в качестве первого кризиса в сфере программирования. Это событие заключалось в приближении себестоимости программного обеспечения к себестоимости аппаратного обеспечения. Причём динамика возрастания этих цен давала возможность сделать прогноз, что к девяностым годам двадцатого века весь мир станет разрабатывать компьютерные программы. Тогда и появилось понятие программной инженерии как некоторой дисциплины, занимающейся выработкой методик сокращения стоимости программных продуктов. В России это именовалось технологией промышленного программирования.
С того времени программная инженерия непрерывно развивалась. Этапы развития программной инженерии разные специалисты выделяют по-разному. Однако все этапы связаны с возникновением, а иногда и с осознанием, новой проблемы и определении методик и способов её разрешения.
Общие сведения о программной инженерии
На начальных этапах формирования программной инженерии, даже когда ещё не было этого термина, отмечался тот факт, что высокая себестоимость программных продуктов сопряжена с проектированием одних и тех же, или аналогичных, кодовых участков в разных программных приложениях. Это объяснялось тем, что в разных приложениях или их фрагментах выполнялось решение одинаковых или схожих задач. К примеру, это задача расчёта зарплаты или решения нелинейных уравнений. Применение при проектировании новых программных продуктов уже имеющихся фрагментов предполагало значительное уменьшение сроков и себестоимости проектирования.
Основной принцип модульного программирования заключался в выделении данных фрагментов и реализации их в модульном формате. Все модули имели описание, где были описаны правила его применения, то есть это был модульный интерфейс. Интерфейс определял набор связей модуля с главной программой, а именно набор связей по информационным данным и по управляющим воздействиям. Причём повторное применение модулей задавалось числом и уровнем сложности таких связей, или же возможностью согласования данных связей с организацией информационных данных и управлением базовой программой.
Самыми простыми с этой точки зрения явились модули разрешения математических задач, а именно:
- Задачи решения уравнений.
- Задачи решения системы уравнений.
- Оптимизационные задачи.
На текущий момент сформированы и с успехом применяются целые библиотечные наборы подобных модулей.
Для модулей других типов их повторное применение вызвало большие проблемы, определяемые сложностью их взаимодействия с базовым программным продуктом. К примеру, модуль по расчёту заработной платы, созданный для одной компании, может оказаться непригодным для других фирм, поскольку заработная плата в данных фирмах может рассчитываться по отличающимся правилам. Повторное применение модулей, имеющих сложные интерфейсы, и поныне представляет из себя актуальную проблему. Чтобы её решить, проектируются специализированные структуры отображения модулей и их интерфейсной организации.
Очередной этап роста себестоимости программного обеспечения был вызван переключением внимания с проектирования сравнительно несложных программ на формирование сложнейших программных комплексов. Необходимо заметить, что данное переключение было сопряжено с разработкой и внедрением вычислительных устройств третьего поколения, выполненных на интегральных схемах. Применение интегральных схем позволило увеличить на порядок производительность компьютерного оборудования, что и сформировало предпосылки к решению сложных задач. К таким сложным задачам следует отнести:
- Разработка систем управления космическими объектами.
- Разработка систем управления оборонными объектами.
- Разработка систем автоматизации больших финансовых организаций и так далее.
Сложность этих программных комплексов может быть оценена следующими аспектами:
- Значительные размеры программного кода, исчисляемые миллионами строк.
- Огромное число связей среди компонентов программного кода.
- Значительное число программистов, исчисляемое сотнями специалистов.
- Значительное число пользователей программного комплекса, исчисляемое тысячами человек.
- Длительный период применения программного комплекса.
Для данных программных комплексов было определено, что большую часть их себестоимости составляет не само формирование программ, а их внедрение и эксплуатация. Аналогично промышленным технологиям стало использоваться понятие жизненного цикла программных продуктов, под которым понималась последовательность следующих этапов:
- Проектный этап.
- Этап реализации.
- Этап тестирования.
- Этап пуска в эксплуатацию.
- Этап сопровождения.
Этап сопровождения программного комплекса состоял из операций по коррекции обнаруженных в работе программы ошибок, а также внесении коррективов согласно с меняющимися пожеланиями пользователей. Главная причина повышенной себестоимости, а иногда и нереальности исполнения, сопроводительного этапа заключалась в плохой реализации проектных работ над программой. Сопроводительная документация могла быть не совсем ясной и понятной и не соответствовать программным кодам. Да и сам программный код мог быть запутанным и сложным. Появилась необходимость в технологии, гарантирующей правильность проектных работ и кодирования. Так появилась технология структурного проектирования и кодирования программ.