За свой относительно небольшой опыт работы (порядка 6 лет) я довольно часто слышал фразы опытных и начинающих программистов — «Я чувствую, что это должно работать», «У меня есть ощущение, что этот метод работать не будет», «Давайте сделаем интуитивно-понятный интерфейс» и так далее. Всё это — проявление интуиции в процессе разработки и программировании.
О ней и пойдёт дальше разговор.


Взято с сайта oprah.com

Для начала хотелось бы определить само понятие «интуиция».

Интуи?ция (позднелат. intuitio — «созерцание», от глагола intueor — пристально смотрю) — метод решения задач посредством единомоментного подсознательного вывода, основанный на воображении, эмпатии и предшествующем опыте, «чутьё», проницательность.

«Википедия»

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

Интуиция (от лат. intueri — пристально, внимательно смотреть) — знание, возникающее без осознания путей и условий его получения, в силу чего субъект имеет его как результат «непосредственного усмотрения»

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

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

Поэтому, прежде всего, хотелось бы разделить «интуитивное» программирование на 2 составляющих: - оптимистическое и пессимистическое

Оптимистическое интуитивное программирование


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

Интуиция, основанная на опыте


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

Большое количество примеров использования такой интуиции в процессы работы описал Дмитрий Чепель из Acronis в своей статье на Хабре. Если Вы ещё не читали, обязательно прочитайте.

Я бы хотел предложить вам другой пример-эксперимент. Ниже приведён пример кода на языке Sidef (я надеюсь не многие из Вас знают его). Попробуйте не особо вникая в детали, догадаться о чём он:

loop {
        var swapped = false
        { |i|
            if (arr[i-1] > arr[i]) {
                arr[i-1, i] = arr[i, i-1]
                swapped = true
            }
        } * arr.end
        swapped || break
    }
    return arr

Ответ
Это классическая сортировка «пузырьком»

Возможно, часть из Вас догадалась о чём идёт речь, увидев в коде знакомые части, возможно некоторые нет. Я попробовал провести этот эксперимент на небольшой группе своих знакомых программистов и результат таков — больше половины (порядка 65%) человек смогли за очень короткое время понять о чём идёт речь.

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

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

Именно из-за этого нам кажется, что более опытные программисты обладают неким «чутьём» касательно проекта или какого-либо языка программирования.

Интуиция, основанная на логике


Попроуйте продолжить следующий ряд:

1, 3, 5, 7, 9, 11, ...

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

Но что, если взять для примера следующий кусок кода на Python:

def sum(a, b):
...

def mult(a, b):
...

def subtract(a, b):
...

def divide(a, b):
...

def calculate(a, b, strategy):
...

calculate(4, 2, sum) #6
calculate(4, 2, mult) #8
calculate(4, 2, subtract) #2
calculate(4, 2, divide) #??

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

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

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

Интуитивно-понятный интерфейс


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

Ожидания же эти формируются на основе 2 составляющих — нашего предыдущего опыта и логических закономерностей и предположений.

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

Но почему же иногда, когда мы заходим на какой-то веб-сайт с оригинальным дизайном или новое мобильное приложение, у нас складывается ощущение, что этот сайт выглядит круто или ужасно?

Интуиция как иррациональное


Основой такого суждения, является то, что часто интуиция рождается как просто ощущение чего-то, неподкреплённое какими-либо выводами, логикой или опытом.

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

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

Пессимистическое инстинктивное программирование


Но интуиция может нести и негативный характер при разработке.

Как упоминалось выше «иррациональная» интуиция является одновременно и палочкой-выручалочкой и опасным инструментом в руках программиста.

Опираясь на такие инстинктивные решения мы теряем уверенность в написанном нами коде, в котором начинает происходить «магия».

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

В качестве заключения


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

P.S. Для тех, же кому интересна тема интуции в разработке ПО, советую почитать доклад Питера Науэра «Интуиция в разработке программного обеспечения»

Спасибо!
Поделиться с друзьями
-->

Комментарии (32)


  1. MetaDone
    27.12.2016 00:16

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


    1. aso
      27.12.2016 08:03
      +2

      … а потом выясняется, что дефолты у этих «censored» были нетрадиционные — и вся интуиция летит к чертям…


  1. KvanTTT
    27.12.2016 00:25
    +4

    1, 3, 5, 7, 9, 11, ...

    Сначала показалось, что это последовательность простых чисел.


    1. master_j
      27.12.2016 10:27
      +1

      Уже единица — не простое число


    1. kallivad
      27.12.2016 10:27

      9 = 3*3 никак не является простым числом


    1. sielover
      27.12.2016 12:07
      +6

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


  1. maniacscientist
    27.12.2016 01:05
    +3

    Вредитель этот Питер Науер… Так и до требований хорошей интуиции при трудоустройстве докатиться можно


  1. nrcpp
    27.12.2016 07:24
    +2

    Почему-то вспомнилось
    image


    1. nrcpp
      27.12.2016 07:28
      +1

      Если серьезно, во фрилансе хорошая интуция — одно из жизненно важных качеств. Как на картикне выше, часто требуется написать программу по скриншоту, быстро разобраться в чужом коде, добавить функционал по одному требованию вроде «я хочу такую-то свистелку с турбодвигателем».


  1. mayorovp
    27.12.2016 08:36
    +6

    calculate(4, 2, divide) — это не интуиция, а самодокументируемый код. Интуиция — это когда написано calc(4,2,d) — а тебе все равно очевидно, что там деление.


    1. andrewnester
      27.12.2016 08:57

      Да, соглашусь с Вами. В контексте интуиции лучше было бы использовать имена c, d, s, m
      Завелась просто дурная привычка выбирать понятные имена функций :)


      1. icoz
        28.12.2016 16:25
        -2

        Использование b, d, s, m ещё более интуитивно.


    1. OlegZH
      30.12.2016 10:22

      А вот это интересно. Что лучше: calculate(4, 2, divide) или divide(4, 2)?

      С одной стороны, это, вроде бы, вопрос синтаксиса. Но, с другой стороны, это вопрос явного указания «модели вычислений».

      Языки программирования различаются по синтаксису, и какой-то синтаксис может оказаться более интуитивно понятным. Вызов divide(4, 2) короче, но он заставляет помнить о том, в каком порядке должны располагаться аргументы функции. Вызов calculate(4, 2, divide) не добавляет никакой новой информации по этому поводу, появляется, по сути, только, дополнительный оператор «вызов функции», позволяющий изменять вызываемую функцию (в зависимости от контекста).

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

      В пределе, мы получаем, по существу, текст на естественном языке, потому что именно он даёт интуитивно понятное описание (того чего нужно). Например, фраза «разделить 4 на 2» сразу сообщает нам, что на что делится, что является числителем, а что — знаменателем.


  1. Zonzen
    27.12.2016 10:28
    +1

    Зачем Вы пишете эту чушь? Займитесь лучше осознанным программированием, вместо интуитивного бреда.


    1. hottabov
      27.12.2016 12:55
      +1

      Интуитивно чувствую, что вы не программист.


  1. road_t
    27.12.2016 10:29
    -3

    Это называется «вуду-программирование». Ничем хорошим кончиться не может по определению.
    P.S. Плохо, что интуиция не подсказала автору, что пишется «прийти».


    1. andrewnester
      27.12.2016 10:30

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

      P.S. Спасибо, исправлено :)


  1. CaptainCrocus
    27.12.2016 10:31
    +3

    Интуиция как иррациональное
    Основой такого суждения, является то, что часто интуиция рождается как просто ощущение чего-то, неподкреплённое какими-либо выводами, логикой или опытом.

    При этом «интуиция как иррациональное» полностью соответствует двум из трех определений интуиции в начале статьи.

    Часто интуитивные озарения являются лишь «запомнившимися» эпизодоми, не выходящим за рамки своей вероятностной оценки в пределах всей выборки. Просто сбывшиеся «предсказания» запоминаются лучше :) И ошибки, рожденные, интуицией более часты, чем «попадания». Увязывая это с понятием накопленного опыта, можно выделить такие ошибочные эвристики, как ошибки репрезентативности и ошибки, связанные со знанием «задним числом».

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

    Именно! Поэтому тема эвристических ошибок более чем полностью раскрыта в статьях Элиезера Юдковского, работах Канемана и Тверски, и частично у Нассима Талеба.

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

    Спасибо за ссылку на Науера.


  1. KpoKec
    27.12.2016 10:31
    +2

    Интуиция в программировании ограниченно хороша для построения алгоритмов и абстракций, но не для реального кода, который должен формализоваться по логике. Иначе получается в комментариях "сильное колдунство", "шаман, однако", "магия"… багфикс через неё быстрый иногда, но его качество?


  1. k12th
    27.12.2016 11:27
    +1

    Оставьте интуицию литературным критикам. Самодокументирующийся код — это просто прилично написанный код.


  1. Shamov
    27.12.2016 11:38
    +2

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


    1. CaptainCrocus
      27.12.2016 12:48

      это просто результат успешного сопоставления с некоторым нетривиальным паттерном.

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

      Ах если бы… И было бы нам ну не щастье, но полущастье точно :)


      1. Shamov
        27.12.2016 13:46

        Как это неизвестно? А Алексей Редозубов для кого свои статьи на Хабре пишет?


        Конечно, под словом "просто" имеется в виду не то, что это "не сложно". В данном случае слово использовано в качестве слова-паразита.


        "Нативно" в данном случае означает, что сам алгоритм сопоставления реализован "аппаратно". Сами паттерны, которые распознаются, конечно, хранятся в памяти в виде данных (это опыт). Та же самая способность к освоению языка — это тоже частный случай сопоставления с шаблоном. Особенно очевидным это становится, когда мы видим как легко и непринуждённо человек распознаёт разные смыслы одного и того же слова в различных контекстах. Компьютеру такая непринуждённость и не снилась, потому что он связан необходимостью использовать логику.


        1. CaptainCrocus
          27.12.2016 15:11

          Простите, промахнулся, ответ ниже.


  1. CaptainCrocus
    27.12.2016 15:10

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

    В этом-то и вся магия, что неизвестно, как это происходит.

    Это не утверждение «есть ли жизнь на Марсе, нет ли жизни на Марсе — науке это не известно», не лирическая метафора, и не дань мракобесию.

    Это ни в коей степени не умаляет значение лекций Редозубова — они замечательны, именно построение таких моделей двигает науку и само познание вперед. Я говорю о другом, что все понимание нейронных сетей находится в рамках сегодняшнего уровня знания и понимания. Повторяю, из этого не следует, что раз познание бесконечно и требует порой неимоверных от человечества усилий, то, что познавай, что не познавай — один хрен. Я это не говорил.


    1. Shamov
      27.12.2016 16:26

      Не думаю, что это работает именно так… Типа, до тех пор, пока не удастся воссоздать идентичный когнитивный аппарат, следует считать, что нам о когнитивных процессах вообще ничего не известно. Знание квантовано намного мельче. Всё-таки кое-что об этом мы уже знаем, несмотря на то, что воссоздать не можем. Более того, я вам открою маленький секрет. Воссоздать не удастся вообще никогда. Основная проблема даже не в том, чтобы собрать аппарат, а скорее в том, чтобы его включить. Дело в том, что мозг представляет собой динамическую систему, процессы в которой происходят непрерывно. Его нельзя выключить, а потом включить. Выключение необратимо. А в случае искусственного воссоздания по-любому должен быть момент включения. Ведь сборку так или иначе придётся производить в выключенном состоянии. Вот такие дела.


      Но в любом случае это всё не более, чем отступление от темы. Мой основной поинт в том, что то, какие принципы лежат в основе работы мозга, известно более-менее точно. Конкретный механизм, возможно, и не такой, какой описан у Редозубова. Но общий принцип, безусловно, состоит в том, что мозг непрерывно только тем и занимается, что распознаёт шаблоны. Самые разные. Визуальные, когда анализирует видеопоток… звуковые, когда анализирует звуки… речевые, когда распознаёт речь… даже, черт возьми, шаблоны проектирования, когда пытается понять чужой код. Вообще абсолютно любая задача, решаемая мозгом, так или иначе сводится к задаче на распознавание шаблона. Это давно было подмечено. Именно поэтому появились тесты на IQ. При том, что они всего лишь измеряют способность к обучению третьего уровня, они позволяют получить хорошее представление о том, насколько эффективно работает мозг конкретного человека.


      1. CaptainCrocus
        27.12.2016 16:58

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

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

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


  1. worldmind
    27.12.2016 17:37
    -1

    Надо разделить:

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


  1. Durimar123
    28.12.2016 18:41

    ИМХО интуитивно понимать чужой код это рулез.

    Но интуитивно кодить… Код должен быть строго понятен хотябы :) автору.

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

    Куда тут интуицию приткнуть?


    1. andrewnester
      28.12.2016 23:21

      так в статье идёт речь как раз об интуитивном понимании кода, а не написании, не совсем понял почему у вас такая мысль возникла


      1. Durimar123
        29.12.2016 11:46

        Возможно из-за примерно таких строк?

        >это — проявление интуиции в процессе разработки и программировании.
        >Интуитивное программирование
        >позитивном влиянии интуиции на процесс создания кода


        1. andrewnester
          29.12.2016 19:28

          я интуицию рассматривал в основном в контексте отладки написанного кода.

          Вы согласны, что большая часть срздания кода и разработки — это не чисто его написание и проектирование, а отладка написанного?