Интуитивное программирование
О ней и пойдёт дальше разговор.
Взято с сайта 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. Для тех, же кому интересна тема интуции в разработке ПО, советую почитать доклад Питера Науэра «Интуиция в разработке программного обеспечения»
Спасибо!