«Программирование лучше секса»



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

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

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

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

    Предисловие


    Толчком к написанию данной статьи послужил недавний материал на Хабре «Хватит уже бояться субъективно красивых решений в коде — вы же не роботы», в которой автор пытается обосновать свою интуитивную тягу к созданию красивого кода.

    Однако, судя по комментариям к той статье, не все читатели разделяют аргументы автора на уровне «инженерной чуйки». Хотя есть и согласные с подобной аргументацией:
    «Конечно, код должен быть красивым. Ёлки-палки, ВСЁ в жизни должно быть красивым! Иначе, если что-то уродливо, можно железобетонно сказать «это баг» (иногда с этим приходится жить, но это — баг!)»
    Правда другие предлагают сопротивляться внутреннему голосу и не откладывая начать лечение «патологического перфекционизма, который может быть видом обсессий, компульсий или ОКР».

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





    Но для меня ближе разработка программного обеспечения, о которой дальше и пойдет речь.

    Таинства процесса творения программного обеспечения


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

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

    И только со временем начинаешь понимать, что прописные истины гораздо гибче. И в четком водопаде есть толика гибкости, и в Agile есть планы и сроки. Поэтому истина как всегда, где-то посередине.

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

    Более того, один и тот же код может быть признан и красивым и уродливым одновременно! А это означает, что понятия о красоте сугубо индивидуальны (кто бы сомневался). Что такое красивый код, и как его писать?, Итоги 20-го международного конкурса непонятного кода на C.

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

    Так что же движет этими винтиками, в маленьких компаниях и больших корпорациях, в бездушных машинах индустрии генерации программных продуктов?

    Конечно, поиск движущей силы не может обойтись без психологии.

    В чем же движущая сила?


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

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

    К сожалению, мне так и не встретилась подобная классификация (возможно, я не нашел или не там искал), поэтому в результате анализа собственного опыта и общения с коллегами, решил самостоятельно выделить следующие типы мотивации разработчиков с условными названиями: Материальная, Социальная и Внутренняя.

    Материальная мотивация


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

    Социальная мотивация


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

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

    Внутренняя мотивация


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

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

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

    typedef unsigned char t;t*F="%c",l[]="|\\/=_ \n](.\0(),*(.(=(}*.)[[*.",N='\n',*
    r;typedef(*H)();extern H Ar;Q(a){return(a|-a)>>31;}H S(c,a){return(H)(a&~c|(int
    )Ar&c);}extern t*ist;V(t*u){*u^=*u&2^(*u>>7)*185;}Z(t*u,t n){*u-=n;}e(t c,H h){
    R(h,Q(*                                                                 r^c));}
    I(){r=l                                                                 +7-4*Q(
    getchar                                                                 ()^*l);
    }R(H h,                int                                              c){Ar=S
    (c,h);-                main()                                           ;}P(){r
    ++;}z()                {                                                O(&N);}
    O(t*c){                    printf(                                      F,+*c);
    }T(){r=                        "This is not a function\n"               ;}w(U){
    U=Z(r,8                    );                                           r-=~Q(*
    r/8-4);	                   return 0;                                    }M(){r=
    ist-68;                }                                                h(){t G
    =r[1]-r                                                                 [2]^*r;
    G^=30;V                                                                 (&G);e(
    0,(O(&G                                                                 ),P(P(*
    r++)),z));}g(){M();R(h,0);}f(){P(O(r));e('f',g);}p(){P();e('a',f);}d(){P(O(r));
    e('n',p);}c(u){u=r[-2];T(Ar=d);R(f,Q(u^'"'));}n(){e(w(O(l+*r%8)),c);}a(){I();R(
    n,0);}main(){S(Q(Ar),a)();}H              Ar;t*ist="Rene Magritte"-(1898-1967);

    Когда шутка заставляет задуматься


    Изначально эта статья писалась как шутка, да и её название говорит за себя, поэтому и картинку подобрал соответствующую.

    Каково же было мое удивление, когда я понял, что сформулированная классификация мотивов тяги программистов к красоте мне очень сильно что-то напоминает. Эти мотивы очень четко проецируется на известную пирамиду потребностей Маслоу.



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

    Это уже не шутка?


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

    Ведь в случае появления реальной методики оценки красоты кода с точки зрения мотивации, уже не составит большого труда добавить её в различные утилиты для оценки стиля кодирования, такие, как pylint, cpplint и прочие lint. И после это появится возможность оценивать мотивацию конкретных разработчиков без проведения каких либо психологических тестов и заполнения нудных опросников. Достаточно будет пропустить их код через анализатор.

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

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

    UPDATE 1: Оcтавлю ссылку на зарисовку от janvarev по теме статьи: Сергей и «программирование лучше секса»

    UPDATE 2:
    По первым итогам голосования выявилось тенденция голосовать преимущественно за внутреннюю мотивацию (145 — 60,3%). Но прежде чем выбрать при голосовании третий вариант, подумайте, пожалуйста, вот над чем: Кто задает критерии качества (или эстетики) в вашем проекте?

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

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

    Чтобы однозначно это проверить, представьте ситуацию, когда у вас плохое «черное» настроение, и результат работы (написанный в это время программный код) ему соответствует. Одобрят ли ваш коммит? Если да, даже не смотря на неполное соответствие принятым критериям качества, тогда ваша мотивация действительно Внутренняя. Но если ваш код будет отклонен, значит ваша мотивация все же Социальная, хотя обычно она и находится в гармонии с Внутренней.

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    А у тебя какая мотивация при написании кода?

    • 19,4%Материальная — Мне плевать на красоту! Я готов писать даже говенный код, если за это хорошо платят.72
    • 7,3%Социальная — Сейчас разработка ПО, это коллективные усилия, где самое главное, это оценка коллег.27
    • 59,3%Внутренняя — Для меня важно, чтобы самому нравилось, а все остальные пусть идут лесом.220
    • 14,0%А секс все равно лучше! — Я не программист.52
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 48

      +1
      О, очередной теоретик. Привёл пример из IOCCC, а что сказать хотеть — забывать, да?
        +1
        Почему теоретик? Как раз исключительно практик.
        И да, пример кода с конкурса IOCCC, даже ссылка на это в статье имеется.
        +3
        В голосовалке предлагаю добавить пункт «люблю все автоматизировать» и/или «люблю делать полезные продукты/программы/приложения»
          0
          Голосовалка нужна для выявления вашей мотивации и не важно, что является конечным продуктом: «автоматизация или программы/приложения». Поэтому, не важно, что конкретно вы делаете, важен ваш настой, с которым вы обычно делаете свою работу.
            0
            Для меня это и есть настрой — делать что-то полезное
              0
              В этом случае, если вы делаете что-то полезное только для себя, то ваш выбор «Внутренняя — Для меня важно, чтобы самому нравилось, а все остальные пусть идут лесом.», если же вы делаете это не только для себя, но и для других, то ваш выбор «Социальная — Сейчас разработка ПО, это коллективные усилия, где самое главное, это оценка коллег»
                +1
                Так, стоп. Я делаю вместе с коллегами нечто для заказчика. Мне прежде всего важна оценка заказчика, оценка коллег вторична. Такого пункта в списке нет.
                  –1
                  Почему? Это самый первый пункт: «Материальная — Мне плевать на красоту! Я готов писать даже говенный код, если за это хорошо платят.»
                  Ведь одобрение заказчика, это и есть материальный стимул.
                    0
                    Рили?
                      +1

                      Вы заказчику бесплатно делаете что ли?

                0
                Что есть полезность?
                Все, что производит человек в большинстве своем увеличивает хаос и добавляет мусора.
                  0
                  Что есть полезность?
                  Для меня это и есть настрой — делать что-то полезное
                  Полезность, это то, что вы сами вкладываете в это слово.
                    +2
                    Цитируя (близко к тексту) одного хорошего человека: «это маленькое изменение в номере версии и большой геморрой для всего человечества»
                      0

                      Даже автоматизированный завод по переработке мусора?

                0
                краса

                typedef unsigned char t;
                t*F="%c", l[]="|\\/=_ \n](.\0(),*(.(=(}*.)[[*.",N='\n',*r;

                typedef(*H)();
                extern H Ar;
                Q(a)
                {return(a|-a)>>31;
                }
                H S(c,a)
                {return(H)(a&~c|(int)Ar&c);
                }
                extern t*ist;
                V(t*u)
                {*u^=*u&2^(*u>>7)*185;
                }
                Z(t*u,t n)
                {*u-=n;
                }
                e(t c,H h)
                {R(h,Q(*r^c));
                }
                I()
                {r=l+7-4*Q(getchar()^*l);
                }
                R(H h,int c)
                {Ar=S(c,h);
                — main();
                }
                P()
                {r++;
                }
                z()
                {O(&N);
                }
                O(t*c)
                { printf(F,+*c);
                }
                T()
                {r=«This is not a function\n»;
                }
                w(U)
                {U=Z(r,8); r-=~Q(*r/8-4); return 0;
                }
                M()
                {r=ist-68;
                }
                h()
                {t G=r[1]-r[2]^*r;G^=30;V(&G);e(0,(O(&G),P(P(*r++)),z));
                }
                g()
                {M();R(h,0);
                }
                f()
                {P(O®);e('f',g);
                }
                p()
                {P();e('a',f);
                }
                d()
                {P(O®);e('n',p);
                }
                c(u)
                {u=r[-2];T(Ar=d);R(f,Q(u^'"'));
                }
                n()
                {e(w(O(l+*r%8)),c);
                }
                a()
                {I();R(n,0);
                }
                main()
                {S(Q(Ar),a)();
                }
                H Ar;
                t*ist=«Rene Magritte»-(1898-1967);
                  +1
                  Ничего не понятно. Это стихи такие?
                    +1

                    Это отформатировали отсылку к c'est ne pas une pipe.

                      0
                      Как-то слишком концептуально. Следующий уровень квайна — c'est ne pas une programma? ;)
                  +1
                  Когда есть устойчивая внутренняя мотивация писать код за деньги, чтобы результат нравился людям. Это к какому уровню пирамиды относится?
                    0
                    Наверно, это ваш случай:
                    Конечно, подобное разделение мотивов работы программистов является условным и может перетекать из одного типа в другой или даже являться комбинацией сразу нескольких мотивирующих факторов.
                      +3
                      Извините, тут немного о другом.
                      «чтобы результат нравился людям» и «чтобы код эстетически нравился мне» — это две разные вещи и статья больше о другом.

                      Заметьте, чаще всего вы будете считать этот результат идиотским — но людям (заказчикам) результат будет нравиться.
                      Так вот, если у вас есть мотивация «чтобы результат нравился людям» — то проблем с деньгами у вас не будет.
                      Основная причина «выгорания» — это как раз идиосинкразия к желаемому заказчиком результату.
                        +1
                        Тогда давайте сверим понимание терминов:
                        «Нравится заказчику» — в моем понимании, это вообще слабо относится к эстетическому виду программного кода. Тем более Заказчик на него может вообще не смотреть. Ему важен функционал, возможность масштабирования, стоимость поддержки и т.д. Причем все это должно быть в определенных (и ограниченных) временных рамках.

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

                        Соответственно, мотивация «чтобы код эстетически нравился мне» мнение окружающих в расчет не принимает (или учитывает лишь в минимальной степени).

                        Тогда изначальный вопрос «Когда есть устойчивая внутренняя мотивация писать код за деньги, чтобы результат нравился людям. Это к какому уровню пирамиды относится?» будет находится где-то между серединой и нижней частью пирамиды потребностей.
                          0
                          «чтобы результат нравился людям» и «чтобы код эстетически нравился мне» — это две разные вещи и статья больше о другом.
                          Почему вы считаете такое противопоставление необходимым, что я, по-вашему, не человек?)
                            0
                            Надеюсь, что человек :-) А противопоставление необходимо для того, что бы разделить два разных типа мотивации «для себя» и «для других».
                      +3
                      По-моему красота кода это не про эстетику, а про уровень мастерства. Нередко встречаю ребят, которые уверяют, что умеют писать красиво и качественно. Однако на практике по разным причинам выдают результат, не соответствующий тем или иным критериям. Чаще всего ссылаются на нехватку времени, MVP подход, стресс, давление менеджера. В общем разные довольно понятные и бесспорно объективные причины.

                      Когда в последний раз вы писали безкомпромиссно качественный код? — вот по всем тем критериям, которые сами считаете best practices. И знаете что, оказывается многие не писали ни разу. Как можно заявлять об умении, ни разу этого не сделав? Мечты? Фантазии? 50 оттенков серого с элементами садомазо? Получается, вместо того, чтобы практиковаться писать качественно, ребята прокачивают навык рассказывать правдоподобные истории про то, почему они так не делают.
                        0
                        То, что вы описали, попытка скрестить материальную мотивацию с остальными типами. По сути, человек пытается закрыть социальные или эстетические потребности, хотя ему приходится заботится о низменных базовых.
                        +6
                        На заре своей трудовой деятельности я слышал другой анекдот. Это уже правда было в 90-х
                        Стоят старая и молодая проститутки на боевом посту.
                        Светает, надо закругляться…
                        Видят идет мужик, волосы взъерошены, глаза красные…
                        Молодая:
                        — Может последнего обслужим?
                        Старая:
                        — Не приставай. Это свой, программист. Тоже всю ночь трахался.
                          +2
                          Э-э-э «красота в глазах смотрящих».
                          То что вам кажется красивым для другого страшное уродство и наоборот.
                          Поэтому я бы не опирался на понятие «красоты». :-)
                            +1
                            По первым итогам голосования выявилось тенденция голосовать преимущественно за внутреннюю мотивацию. Но прежде чем выбрать при голосовании третий вариант, подумайте пожалуйста вот над чем: Кто задает критерии качества (или эстетики) в вашем проекте?

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

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

                            Чтобы однозначно это проверить, представьте ситуацию, когда у вас плохое «черное» настроение, и результат работы (написанный сегодня программный код) ему соответствует. Одобрят ли ваш сегодняшний коммит? Если да, даже не смотря на неполное соответствие мнению коллектива, тогда ваша мотивация действительно Внутренняя. Но если ваш код за сегодня будет отклонен, значит ваша мотивация все же Социальная, хотя обычно она и находится в гармонии с Внутренней.
                              0
                              Соответственно, мотивация «чтобы код эстетически нравился мне» мнение окружающих в расчет не принимает (или учитывает лишь в минимальной степени).

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

                              Код ревью в этом смысле довольно спорный пример. Это скорее ограничение, а не лайки. Иначе так любой quality gate вроде проверки кода тайпчекером, юнит тестами, или даже размер вашего рабочего помещения можно назвать суррогатом социального одобрения с далеко идущими последствиями.
                                0
                                Иными словами, внешняя мотивация это когда приходится прилагать усилия из вне, чтобы сотрудник выполнял работу. А внутренняя это когда он делает все то же самое, но добровольно?)
                                Нет, не так.
                                Речь идет исключительно о собственной мотивации, а она всегда направлена изнутри.
                                Тут вопрос, на что эта мотивация направлена. На получение собственного одобрения или на ожидание одобрения от окружающих.
                              0
                              Где вариант ответа «никакая»? У меня последнее время мотивация сломалась и делать ничего не могу.
                                0
                                Это внутрення мотивация в чистом виде, которую можно сформулировать и так: «Лично мне нравится ничего не делать, а все остальные пусть идут лесом» ;-)
                                  0
                                  Нет, мне не нравится ничего не делать, но и что-то сделать никак не соберусь.
                                +3
                                КДПВ — «Руки из жопы»?
                                  0
                                  Иногда, глядя на код, кажется, что его примерно так и писали.
                                  +1
                                  Естественно, тогда я не считал, да и сейчас не считаю, что программирование может быть заменой хорошему сексу

                                  Хм, наверное, надо было все же первый секс устроить до первого кода, а не через 9 лет после.

                                    0
                                    А что вас навело на мысль, что было по другому?
                                      0

                                      Так как вся эта ерунда даёт положительную обратную связь, то к 17-18 годам мозг не был бы заточен под получение дофамина от одного программирования вкупе с социальной дезадаптацией.

                                      0
                                      В начальной школе-то еще рано
                                        0

                                        Ну вот и я про то же. Мой первый код был лет в 10.

                                    +2
                                    Конечно лучше. Потому что оно чаще.
                                      0

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

                                      0
                                      Ох уж эта пирамида Маслоу, которая не работает.
                                        0

                                        Это все прекрасно раскладывается по полочкам в книге Андрея Курпатова «Троица», которая основана на современных научных трудах о работе мозга. Там выделяются три типа личности: конструкторы, центристы и рефлекторы. Каждый по-своему выстраивает в голове модель реальности. Думаю, автору статьи будет интересно почитать

                                          +1

                                          Только невозможно разделить четко всех людей на три типа, и даже на 16. Человек сложнее и оказывается что в каждом человеке есть что-то от каждого типа.

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое