Программирование наука или искусство? Это извечный вопрос, который задавался уже множество раз, и до сих пор не имеет однозначного ответа. И все же попробуем ответить на этот вопрос более мене аргументировано.
Начнем рассмотрение вопроса с понятной всем точки зрения- с жизненного цикла программного обеспечения и с достаточно философского вопроса - а зачем вообще нужны программы и что есть мерило правильности их работы.
Написание любой программы начинается с Потребности
в решении задачи. В данном случае будут рассматриваться любые задачи, даже
те, которые в настоящее время не решаются программным путем. Исходя из потребности
в решении задачи формулируется задача. Мерилом правильности работы
программы является полное решение задачи, породившей необходимость в
написании программы. Причем, в данном случае, имеется ввиду именно полное
решение задачи, которую подразумевал пользователь, а не решение поставленной
задачи. Итого, жизненный цикл, несколько расширенный относительно
стандартного описания, будет выглядеть следующим образом:
Потребность в решении задачи
Постановка задачи
Проектирование
Программирование
Тестирование
Релиз
Эксплуатация
Сопровождение
Полное решение задачи
Попробуем рассмотреть цепочку в плане рождения жизни и смерти программирования как такового и что есть программирование в указанной цепочке. Что в этой цепочке будет существовать вечно, а что со временем пропадет. Для этого введем понятие абстрактной системы разработки, которая в настоящее время состоит из коллектива разработчиков.
Однозначно самую долгую жизнь в этой цепочке будет иметь пользователь со своими потребностями в решении какой-либо задачи. В случае взаимодействия с идеальной системой разработки пользователю достаточно расплывчато сформулировать задачу (а в идеале вообще ее не формулировать). После чего система разработки самостоятельно создаст полное решение задачи, без дополнительных обращений к пользователю. Причем, идеальная система, создаст полное решение задачи за минимальное, приближающиеся к нулю время. Разумеется, такого рода решение подразумевает отсутствие людей в процессе решения задачи, то есть отсутствие программистов как таковых. Это и можно смело назвать смертью программирования как инженерной дисциплины (и триумф систем Искусственного Интеллекта).
Инженерность дисциплины подразумевает применение известных методов для решения поставленной подзадачи. Инженерность предполагает, что каждый цикл в разработке программы выполняется по определенной методике, согласно которой выполнение участка работы производится за прогнозируемое время с прогнозируемым результатом вне зависимости от поставленной задачи.
Научность в программировании способствует уменьшению времени всех фаз инженерного удовлетворения потребности пользователя, повышению качества выполняемой работы. Идеалом научности в программировании является именно создание методики удовлетворения потребности пользователя которая сводит к минимуму участие человека в отдельных фазах процесса программирования (и во всем процессе в целом), а в идеале вообще исключает участие людей в процессе решения задачи. То есть наука программирования является генератором методик, применяемых инженерной дисциплиной программирования. Вершиной науки программирования является перетекание дисциплины из науки в область искусства в программировании. Причем это произойдет именно тогда, когда сама необходимость в существовании науки программирования отпадет полностью, ввиду того, что автоматизированное применение определенного комплекса методик будет полностью решать задачи пользователя без участия людей (включая процесс создания самих методик). И само искусство будет подразумевать комбинирование существующих методик для получения неповторимого творения. Возможно, этот процесс будет связан с обучением автоматизированных систем (то есть скорее напоминать процесс воспитания людей, чем программирование в нынешнем понимании).
Теперь попробуем определиться с самым абстрактным понятием в программировании - что есть искусство в программировании. Однозначно это нечто, что невозможно автоматизировать, то есть логически вывести применив какие-либо методики. Понятие искусства тесно связано с человеческой индивидуальностью, что и придает элемент неповторимости в творениях людей. Если рассмотреть современные методики программирования, регламентирующие все и вся, можно заметить, что они направлены в первую очередь на удаление элементов непредсказуемости и неповторимости из процесса программирования (хороший тому пример - спецификации на форматирование текстов программ). В принципе понятие искусства существует скорее среди самих программистов в плане изящности решения какой-либо задачи. Пользователь же системы видит исключительно вершину айсберга - пользовательский интерфейс и пользователя интересует полнота решения его задачи. Что и оставляет простор для искусства в программировании.
В среде программистов в качестве искусства следует рассматривать именно различия в применяемых методиках и их комбинировании. То есть это и следует выделять как искусство программирования.
Все вышеизложенное можно представить в графическом виде:

Стоимость конечного решения зависит в первую очередь от трудоемкости * наукоемкость.
Согласно выдвинутым предположениям следует считать научным результатом предложение технологии или методики, способной сократить время пребывания процесса решения задачи в любой инженерной фазе процесса программирования, от бесконечности (ранее не решаемая задача), определяемого количества, до нуля (полная автоматизация решения).
Инженерным является процесс применения существующей методики в контексте конкретной задачи, что есть практический результат. Прямым доказательством правильности научного результата в программировании является его инженерное применение, в результате которого удалось минимизировать время решения задачи. Кроме того, возможны какие-либо другие доказательства научного результата имитирующее инженерное решение (математическое доказательство или модель), если получение практического результата невозможно ввиду объективных ограничений.