Интуиты против Сенсориков в программировании

Тематическая картинка

...или еще одна точка зрения на "гавнокод"

...а также, несколько советов проектному менеджеру


Предпосылки

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

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

Как найти взаимопонимание? Перестать переживать по поводу "плохого кода"? И сосредоточиться на достижении совместной цели - выпустить работающий продукт?

Первые ответы

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

Ни один из этих подходов не является хорошим или плохим - это всего-лишь два разных подхода.

Свитие с Соционикой

Такая модель, хоть и не ответила мне на вопрос "Что делать?", но на некоторое время остудила мое любопытство по данному вопросу.
И вот, относительно недавно, в очередной раз размышляя на эту тему, меня вдруг осенило! И я решил поделиться этим с Мїром.

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

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

Видеть картину в целом?... Воспринимать мельчашйие детали?...
Что-то мне это напоминает...

Перед тем, как двигаться дальше, рекомендую освежить в памяти информацию из академических источников:

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

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

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

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

Что это меняет?

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

Например, один из основных постулатов Соционики гласит (цитирую своими словами):

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

А понимание этой мысли ведет к тому, что от понятия "гавнокод" откалывается огромный кусок, который более "гавнокодом" считаться не может.
Да, безусловно, встречается код, который считается плохим, как с точки зрения Теоретиков, так и с точки зрения Практиков, а иногда и даже с точки зрения самого его автора (думаю, что у каждого профессионального программиста найдется кусок старого кода, за который ему стыдно). И естественно, что такой код можно смело относить к понятию "гавнокода". Хотя тут тоже, перед тем, как ругать Автора, нужно помнить о том, в каких условиях он писался (Автор просто учился, или был поставлен в жесткие условия, когда его принудили писать в таком стиле). Но как бы там ни было, а такой код подлежит или истреблению, или переписыванию, или забвению.
Но зато тот код, который кажется "гавнокодом" только потому, что не соответствует ожиданиям того, кто его читает - "гавнокодом" считаться уже не может. Может это просто код "из другого лагеря"?

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

Что делать с Интуитами (Теоретиками)?

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

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

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

Интуит ценен при изобретении нового.

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

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

Интуит ценен при разработке ядра. Его место - "в штабе".

Что делать с Сенсориками (Практиками)?

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

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

Сенсорик ценен при рационализации существующего.

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

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

Следовательно

Сенсорик ценен на внедрении и поддержке. Его место - "на передовой".

Предостережение

После прочтения вышеизложенного, у неискушенного читателя может возникнуть два желания:

Хочу предостеречь об опасности и ошибочности подобных действий.

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

К тому же хочется напомнить утверждение из Соционики (цитирую своими словами):

Социотип - это как сосуд. Он определяет форму. А человека формирует то, чем этот сосуд наполнен (воспитание, образование, опыт).
Другими словами, существуют разные Интуиты и разные Сенсорики.

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

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

Подведем итоги

Если Вам кажется, что Вы столкнулись с "гавнокодом", то попытайтесь сначала определить - перед Вами результат труда непрофессионала, или представителя "противоположного лагеря"? Если последнее, то осознайте, что это всего лишь Ваша точка зрения делает этот код "плохим". Реагируйте в соответствии с этим пониманием.

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

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

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

Заключение

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

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