Робот, сгоняй за пивасом

Робот, сгоняй за пивасом

Больше вкусностей найдешь на моем канале - https://t.me/emotional_robot


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

Возможно, я переверну сейчас чье-то мировоззрение, но писать код - это не программирование, это (осторожно, надеюсь, читающий сидит на стуле) - кодинг.

Шок-контент

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

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

В любом случае, с чего-то же надо начинать. И я решил рассказать о различиях в подходах к программированию, так как их понимание позволит вам понять, что легче будет в освоении или что ближе к телу.

Императивный подход

Из самого название интуитивно понятно, что речь идет о прямых командах. Что делают императоры, кроме разбрасывания денег своим боярам за лояльность и проведения прямых линий с холопами? Верно, они раздают распоряжения (команды, указания, лещей). Что сказал император, то боярин должен выполнить. Причем строго последовательно, без самодеятельности.

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

Выйди из комнаты, где я умираю с лютого бодуна. Затем выйди из квартиры, наполненной смрадным запахом перегара. Выйди из подъезда, в котором ссыт Трамп. Иди прямо к противоположному дому. Если увидишь бешеную собаку, пытающуюся откусить руку бомжу из соседнего двора, дай ей палкой по заднице, иначе дай бомжу в еще не откушенную руку пару монеток на портвейн "777". Возле дома поверни направо и иди к магазину с названием "Шестёрочка". Зайди туда, прослушай тираду уборщицы о том, что "Ходит тут всякая железная кодла по помытому", зайди в алкогольный отдел, возьми "Балтику 7", пройди на кассу, заплати за пивас, выйди из магазина и вернись домой.

Я думаю, понятно, что мы опускаем мелкие детали по типу "возьми кошелек из сумки" или "дерни дверь магазина на себя". Сильная детализация не всегда хорошо, и в данном случае суть и с таким алгоритмом уловить можно.

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

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

Декларативный подход

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

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

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

Вывод

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



Report Page