Articles Tagged with: программирование
Программирование и искусство. (часть 2).

В прошлой части мы говорили о программировании. Рассмотрели два определения этого понятия и пришли к выводу, что программирование – творческий акт. Попробуем сегодня двигаться в обратном направлении: поговорим об искусстве.

Искусство

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

© Wikipedia

Итак, попробуем разложить это определение на составляющие и посмотреть, сможем ли мы уложить в нем понятие “программирование”.

Образное осмысление действительности

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

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

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

Вердикт – данная часть определения справедлива, но лишь отчасти.

Процесс выражения внутреннего мира в (художественном) образе

Внутренний мир человека – это его все. Он определяет во многом то, как человек ведет себя, как он ощущает этот мир, как он мыслит и что он творит. Внутренний мир – это огромное скопление чувств, воспоминаний, мыслей. У одного человека он может быть свалкой, в которой даже он сам не может разобраться. Обычно он и сам это понимает:

Я уже и не знаю, кто я.

У другого – это может быть четко упорядоченная структура, в которой нет места ничему лишнему:

Я знаю кто я, знаю себе цену, знаю чего я хочу. И я этого добиваюсь.

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

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

Что я курил перед тем, как это написал?

Творческое сочетание элементов таким способом, который отражает идеи, чувства или эмоции.

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

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

В любом случае, нас спасает слово “или” в этом формальном определении, и мы можем смело заявлять, что “да, под это оно точно подходит!”

И в итоге..

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

Хочу отметить, что все написанное выше – мои личные рассуждения и выводы. Они не являются и не могут являться единственно правильными. Если вы не согласны с каким-либо из суждений или видите в нем противоречие – прошу в комментарии – мне будет интересно обсудить это.


Программирование и Искусство.

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

Вступление

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

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

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

Большой энциклопедический словарь. © «Большая Советская Энциклопедия», Москва, 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 – это ведь будет круто!

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

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

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

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

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

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

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


Monthly Archives
Calendar
August 2019
M T W T F S S
« Sep    
 1234
567891011
12131415161718
19202122232425
262728293031  
Follow me on Twitter
Recently