Что такое программирование? Связано ли оно с искусством? Является ли оно творческим актом? Об этих вопросах и пойдет речь в этой статье.

Вступление

В следующий понедельник намечена защита доклада по философии на тему: “Программирование и искусство. Программирование как искусство.”. Поэтому я решил опубликовать здесь этот пост, который, надеюсь, положит начало циклу статей на эту тему. Определим нашу задачу: для начала, мы хотим понять, какая связь между двумя этими понятиями, какие сходства и различия они имеют? Для этого, мне кажется, сначала следует разобраться в самих этих понятиях в отдельности. Начнем с программирования.

Программирование

Программирование – процесс подготовки задач для решения их на ЭВМ, состоящий из следующих этапов: составление “плана решения” задачи в виде набора операций (алгоритмическое описание задачи); описание “плана решения” на языке программирования (составление программы); трансляция программы с языка программирования на машинный язык (в виде последовательности команд, реализация которых техническими средствами ЭВМ и есть процесс решения задачи). Программированием называют также раздел прикладной математики, изучающий и разрабатывающий методы и средства составления, проверки и улучшения программ для ЭВМ.

Большой энциклопедический словарь. © «Большая Советская Энциклопедия», Москва, 1998.

Таким образом, если исключить из рассмотрения программирование как раздел науки, из этого определения следует, что оно – лишь процесс решения некоторой заранее поставленной задачи, который состоит из нескольких этапов: составление алгоритма, кодирование, трансляция (компиляция). Давайте-ка глянем на более “свободное” определение этого слова:

Программирование — процесс и искусство создания компьютерных программ и/или программного обеспечения с помощью языков программирования. Программирование сочетает в себе элементы искусства, фундаментальных наук (прежде всего информатика и математика), инженерии, спорта и ремесла.

© Wikipedia Так и хочется сказать “опаньки”.

И тут они вошли в рекурсию.

То есть получается, что программирование – не просто некий умственно-механический процесс, но это еще и искусство. Более того это искусство включает в себя элементы совершенно других родов деятельности. Что же получается? Два определения – каждое – открывает разные стороны вопроса.

Попробуем разобраться: кто прав, кто виноват. Программирование – это в любом случае процесс создания программы – реализации того самого алгоритма, который решает поставленную нами задачу. Программа является основной и окончательной целью, ради которой совершается весь процесс. Но начинается все, как уже было сказано, с задачи. И она может быть как простой – “учебной” (например поиск и удаление элементов массива с заданным значением), так и сложной практической задачей, которая описывается многостраничными документами, которую невозможно до конца формализовать и которую не могут с приемлемой точностью сформулировать даже сами заказчики, которые, казалось бы, знают чего хотят.

Начнем с простой задачи: удалить из массива элементы с заданным значением. И предположим, что студент, ее решающий, неплохо работает с языком C++ и STL. И он знает, что есть такой контейнер std::vector, который является в основе массивом. У него есть два варианта решения задачи:

1.

for (std::vector::iterator it = myVector.begin(); it != myVector.end(); ++it)
  if ((*it) == value)
    it = --myVector.erase(it);

2.

myVector.erase(std::remove(myVector.begin(), myVector.end(), value), myVector.end());

Оба варианта решения “стандартны”. Оба не прибегают к использованю каких-либо сторонних средств. Оба дают идентичный результат. Но один из них является несколько “красивее” другого. Какой? Я считаю, что #2, но найдется и тот, кто со мной поспорит. Точно знаю, что найдется.)

Теперь возьмем большую задачу: например, нам требуется построить гибкую систему управления рабочим временем сотрудников в некоторой организации Х с самой прозаичной целью: экономить деньги. Деньги заказчика. И эта цель – единственная, которую он может четко сформулировать. (Утрированно, но в реальности все обстоит примерно так). И тут перед разработчиком возникает широкий спектр возможностей. Эта система может делать A, B и C. А если сделаем еще и D – заказчик просто описается от восторга! Ее можно построить на базе технологий X, Y, а при желании притянуть в нее еще и Z – это ведь будет круто!

Да и наконец научусь это делать

Что же движет разработчиком в этом случае? Четкий, детерминированный, последовательный процесс порождения алгоритма или творческий процесс создания пока только ему одному известного “технологического чуда”? И ответ, на мой взгляд, – и то и другое.

Программист решает как, какими средствами он будет реалзиовывать поставленную задачу. Он решает, какие алгоритмы он будет использовать. Он решает, какие сущности будут работать в логике его программы, какими структурами данных они будут реализованы. Он строит сложнейшие иерархические и поведенческие модели системы (в лучшем случае с использованием специальных инструментальных средств, или хотя бы на бумажке, в худшем – только в голове), он меняет их все по желанию левой пятки и перестраивает все заново. Он с помощью последовательных рефакторингов делает систему все более элегантной, расширяемой, поддерживаемой, понятной. Он время от времени модифицирует алгоритмы, что делает их быстрее. (Все это относится к сферическому опытному программисту в вакууме, в реальности все, к сожалению, обстоит несколько иначе).

Но ведь и без этих многочисленных модификаций, без использования тех или иных технологий, программа может решать поставленную задачу. А это означает, что существуют сотни вариантов реализации одной и той же задачи. И это только правильных вариантов.)) И выбор того или иного варианта – вопрос творческий.

То есть не только сам выбор есть некий творческий акт, но и построение любого аспекта программной системы – также.

Сама программная система в этом случае – есть результат этого творческого акта. Она уникальна не только потому, что она решает конкретную специфическую задачу конкретного заказчика. Она уникальна потому, что к ее созданию приложил руку конкретный разработчик в данный конкретный момент времени будучи в данном конкретном расположении духа.)

А если так – то мы, начиная с того, что программирование – детерминированный процесс решения задачи, приходим к выводу, что его результат – есть нечто творческое, уникальное. Что позволяет говорить о нем, как об искусстве.