Программирование
Программи́рование, процесс создания компьютерных программ или программного обеспечения, а также дисциплина, изучающая методы и приёмы создания и развития компьютерных программ (более точное название дисциплины – инженерия программного обеспечения или программная инженерия).
Программирование включает: анализ предметной области – выделение требований к программе и точную постановку решаемых задач; проектирование программы – выделение компонентов или модулей на основе отдельных решаемых задач, определение способов взаимодействий между ними, определение алгоритмов работы и структур данных, используемых каждым модулем; кодирование – написание отдельных модулей на определённых языках программирования; выявление дефектов и ошибок при помощи тестирования (проверка программы на наборе заранее выбранных сценариев, позволяющем оценить её корректность) и других методов верификации, а также отладку программы; развёртывание – размещение программы в её рабочем окружении, настройка и подготовка её к работе, обучение пользователей работе с программой; сопровождение – поддержка работоспособности, настройка под изменяющееся окружение, выявление дефектов и новых задач, внесение исправлений и изменений. Сопровождение играет особую роль, поскольку многие программы используются в течение десятилетий и должны изменяться в соответствии с изменением решаемых задач или их масштабов, появлением новых устройств или необходимости во взаимодействии с другими программами. В рамках сопровождения много раз проводится перепроектирование, кодирование и тестирование, а также добавление новых компонентов, поэтому бо́льшая часть затрат на разработку программы падает на него. Дополнительные сложности для сопровождения и развития программ возникают из-за размеров и сложности современных программных систем, достигающих десятков миллионов строк кода, на различных языках программирования. Такие масштабы программных систем стали возможны за счёт использования подпрограмм и компонентов, позволяющих создавать иерархические системы из большого количества небольших программ.
Перечисленные виды деятельности при программировании обычно выполняются не в жёстко заданной последовательности, а по мере необходимости; например, исправление ошибки, обнаруженной при тестировании, может потребовать дополнительного анализа требований, уточнения задач и выбора другого алгоритма работы содержащего ошибку модуля. Процессы разработки программного обеспечения, предписывающие определённые правила создания программ, с целью упрощения планирования работ могут налагать различные ограничения на возможные последовательности выполнения таких действий.
В зависимости от поставленных целей, размерности задачи, методов решения различают параллельное программирование, распределённое программирование и др. Языки программирования поддерживают различные стили программирования (парадигмы программирования). В искусство программирования входит выбор языка программирования, наиболее полно подходящего для решения поставленной задачи.
Большинство методов и технических приёмов программирования не универсальны, применимы лишь для специфических видов программ (прикладные, системные, встроенные). Однако можно выделить как базовые следующие три принципа программирования: модульность – существенно различные задачи должны решаться разными программными компонентами, взаимодействующими друг с другом через чётко определённые интерфейсы, и не зависеть от внутренних алгоритмов и структур данных друг друга; использование абстракций – решение любой задачи необходимо оформлять в терминах набора сущностей, достаточных для описания всех существенных элементов задачи и не содержащих лишней, несущественной информации; многократное использование кода – каждый отдельный элемент знания о задаче или её решения должен быть описан однократно, следует избегать дублирования информации и описаний одних и тех же знаний и/или решений в нескольких различных местах в коде программы, поскольку при изменении требований исправлять такую программу гораздо сложнее.
Первым программистом, написавшим в 1843 г. программу (вычисление чисел Бернулли) для вычислительного устройства (аналитической машины Ч. Бэббиджа), считается графиня А. Лавлейс. Программирование на первых компьютерах осуществлялось путём установки переключателей в нужные положения; программ как таковых ещё не существовало. Первая ЭВМ с хранимой в памяти программой (реализация т. н. принципов фон Неймана) – EDSAC (создана в 1949 г.). Развитие программирования (в начале 1950-х гг.) связано с переходом от написания программ на языках машинных инструкций к более удобным для восприятия человеком программам на языке ассемблера, а затем – к языкам высокого уровня, независимым от архитектуры компьютера, первыми из которых были Fortran (1954–1957) и Lisp (1958, от англ. LISt Processing language – язык обработки списков). Некоторые идеи, реализованные в таких языках, сформулированы А. А. Ляпуновым в его операторном методе программирования (1953).
Как дисциплина программирование изучает принципы построения и функционирования программ, используя методы и технические приёмы, а также способы организации как крупных программных систем (выбор архитектуры, выделение компонентов и организация эффективного взаимодействия между ними), так и небольших элементов программ (выбор алгоритмов работы, организация кода отдельного компонента, использование особенностей языков программирования).
В англоязычной литературе вместо термина «Программирование» используется «Software Engineering» – «Программная инженерия» (введён в 1968 Ф. Л. Бауэром, США). В СССР в 1970-х гг. А. П. Ершовым термин переводился как «Технология программирования». Важными вехами в развитии дисциплины стали выделение понятий программного модуля и его интерфейса канадским инженером Д. Парнасом в 1972 г., чёткое определение в начале 1990-х гг. понятия архитектуры программного обеспечения и постепенно расширяющееся применение анализа программ.
Слово «программирование» используется также в некоторых устоявшихся словосочетаниях, например, динамическое программирование, линейное программирование, математическое программирование, где оно обычно является синонимом слова «планирование».