Начну с истории о программистах, которую мне приходилось слышать неоднократно.
Я попросил Джо написать простенькую программу, которая делает <xyz>. Работы там было на несколько часов, в худшем случае на день. Ему понадобилось несколько дней, за который он написал гораздо более сложный фреймворк, чем требовалось. Почему он снова так намудрил?
Возможно, дело в том, что Джо – Абстрактно ориентированный программист (АОП) .
Вот несколько шаблонных фраз (snowclones)
Если вы часто усложняете свои программы, возможно вы АОП.
Если вы проводите больше времени, размышляя о завтрашних проблемах, чем о текущих, возможно, вы АОП>.
Если вам нравится искать глубинные взаимосвязи, ощущать приятную дрожь от бессознательных озарений или рассуждать аналогиями, возможно, вы АОП.
Необходимость абстракций
Разработка программного обеспечения – одно из немногих занятий в котором постоянно приходится иметь дело с абстракциями. Языки программирования, типы данных, графические представления, потоки управления и т.д. являются абстракциями реального мира, абстракциями аппаратного обеспечения и часто абстракциями абстракций.
Резкий рост производительности процессоров (в соответствии с законом Мура) рождает потребность в абстракциях. Я начинал программировать на компьютерах с процессорами, счет транзисторов в которых шел на сотни. У Motorolla 6800 было 4100 транзисторов и тактовая частота 1-2 мегагерца. Zilog Z80 имел 8500 транзисторов и частоту 2-8 МГц. Понимание работы регистров процессора, прерываний и других в каком-то смысле физических процессов очень сильно помогало, когда требовалось заставить эти компьютеры делать что-нибудь действительно полезное.
Сейчас в массовое производство запущены процессоры с миллиардом или около того транзисторов. Например Intel Core i7 содержит около миллиарда транзисторов, и имеет тактовую частоту 2-3.5 ГГц.
Это, примерно, в миллиард раз превосходит вычислительную мощность компьютеров тридцатилетней давности. Человек же так заметно эволюционировать не сумел. Возникла необходимость эффективно использовать прирост мощности процессоров. Тут-то и появились компиляторы, виртуальные машины, сложные интерфейсы, всевозможные оптимизаторы, высокоуровневые языки программирования и другие инструменты. Между аппаратным обеспечением и современными программами лежит множество слоев абстракции. И, конечно же, они необходимы.
Таким образом, нет ничего удивительного в том, что программирование привлекает людей со склонностью к абстрактному мышлению… и, возможно, человек с абстрактным мышлением имеет больше шансов получать удовольствие от работы и добиваться успехов в этой области.
Но, рассуждая подобным образом, очень легко забыть, что не всем людям свойственно абстрактное мышление. Можно даже сделать вывод, что все программисты абстрактно ориентированны или ошибочно заключить, что абстрактное мышление является наилучшим вариантом для них.
Абстрактное мышление
Для начала рассмотрим определения Абстрактный (прилагательное)
отвлеченный, не связанный с непосредственным восприятием реального мира (т.е. фактами)
не прикладной или практический, теоретический
Абстракция (существительное)
процесс формулирования обобщенных идей или концепций посредством извлечения общих свойств или закономерностей из определенного набора примеров
Абстракции – это по определению упрощение информации, которое достигается рассмотрением большого количества примеров и сжатием их в общий шаблон.
Для некоторых людей естественно абстрактное мышление, в то же время другие предпочитают конкретные факты. Абстрактно выражаясь, речь идет о способе, которым люди обрабатывают информацию.
Рассмотрим индикатор типов личности Майерс-Бриггс, который широко используется в бизнесе. Индикатор позволяет определить четыре типа личности, которые подразделяются на основанные на интуиции и здравом смысле (N и S, если использовать обозначения типологии) – соответственно на абстрактное и конкретное мышление. (Существуют другие психологические исследования с похожим разделением типов личности)
Перечислим некоторые особенности, проявляющиеся при абстрактном и конкретном мышлении.
Ввиду того, что многие люди подстраивают свое поведение под обстоятельства, вы также можете трактовать приведенную информацию как абстрактное или конкретное текущее состояние сознания, хотя считается, что каждый человек имеет доминирующую склонность.
Признаки абстрактного/интуитивного мышления
Мысли и идеи
Чтение между строк
Жизнь будущим – бо́льшая заинтересованность проявляется по отношению к будущим возможностям
Лучше запоминаются шаблоны, контекст и взаимосвязи
Комфортно себя чувствуешь, работая с неопределенными размытыми данными, когда приходится угадывать их смысл
Большее доверие проявляется к абстрактной или теоретической информации, взаимосвязям и шаблонам
Признаки конкретного мышления
Реальные объекты и вещи
Чтение самих строк
Фокусировка на «здесь и сейчас»
В памяти хранится большое количество деталей и фактов
Предпочтение отдается четкой и точной информации, не нравится выдвигать догадки, когда нет четких фактов
Предпочтение отдается информации в настоящем времени, которую можно ощутить одним из пяти чувств
Недоверие к догадкам, которые, кажется, появились из неоткуда.
Вернемся к Джо
Вернемся к истории о Джо, с которой начиналась данная статья, где он усложнял код. Для абстрактно ориентированного программиста тут все логично
Сегодня мы имеем проблему X
X – это отдельный пример более общего класса задач, который также включает Y и Z
Чтобы проблемы Y и Z не случились в будущем, я должен написать код, который решает X, Y и Z
Однако, когда во время общения с Джо мы попросили его решить только задачу X, в то время как он знал, что в будущем Y и Z неминуемы, мы обрекли его на расстройство из-за некачественно выполненной работы или даже уверенность, что в будущем его сделают крайним.
Здесь на первый план выходит текущая ситуация. Умение думать наперед может сделать из вас героя. Также умение думать наперед с легкостью превратит вас в обузу. Концентрируясь же исключительно на сиюминутных проблемах, вы станете героем… или обузой.
Весь фокус в понимании, какой подход будет уместным в той или иной ситуации, проще говоря, адаптируйтесь.
Также очень важно согласовывать выбранную стратегию с коллегами, другими словами, общайтесь.
Приведу некоторые отзывы, которые я слышал об абстрактно ориентированных программистах…
Позитив
Она берется за плохо поставленные задачи и прекрасно с ними справляется
Он глубоко продумывает проблему, в результате предлагая элегантные решения
Она постоянно пробует разные приемы в поисках лучшего подхода
Команда (АОП) неожиданно выдвинула ряд прекрасных идей
Негатив
Он постоянно сражается с будущими проблемами, я не могу заставить его сделать быструю правку, когда это необходимо
Она часто сильно усложняет свой код. Иногда мне нужен просто быстрый хак.
Он постоянно пытается переписать всю нашу кодовую базу. Унаследованный код работает – просто оставь его в покое.
Почему она не следует общему плану работ
Совещания нашей команды (АОП) постоянно уходят от насущных проблем. Конечно, обсуждения получаются интересными, но нам нужно сконцентрироваться на решаемой задаче.
… и то же самое про конкретно ориентированных программистов (КОП)
Позитив
Он долго не рассуждает. Просто берет задачу и решает ее.
Она в курсе наших технологических процессов и следует им
Он демонстрирует здравый смысл
Эта команда (КОП) постоянно занимается той задачей, которую они могут и должны делать.
Негатив
Его код решает узкий круг задач. Этого достаточно, чтобы пройти тесты, но мало для реального использования
Ее код негибок и труден в сопровождении. Каждый раз при добавлении новой функции мы вынуждены все переписывать заново.
Он ничего не видит за пределами текущей задачи. Его код не протянет долго.
Мини тест
Список А. Сколько из приведенных в нем пунктов описывают вас наилучшим образом? (Отвечайте не задумываясь)
Вас больше интересует идея в общем, чем тонкости ее реализации
Вы часто задумываетесь о судьбе человечества
Вы с легкостью выделяете общие закономерности из конкретных примеров
Вы часто рассуждаете о сложности жизни
Вы считаете, что практически все поддается анализу
Вы с легкостью понимаете новые теоретические принципы
Вы часто проводите время за размышлениями, как сделать что-либо лучше
Вы с легкостью просчитываете разные пути, по которым может пойти развитие ситуации
Список Б. Сколько из приведенных в нем пунктов описывают вас наилучшим образом?
Вам скучно читать теоретические книги
Вы предпочитаете опираться на свой опыт, а не на теоретические альтернативы
Для вас важно пробовать сделать что-то своими руками
Анализируя ситуацию, вы основное внимание уделяете текущему ее состоянию, а не возможным последствиям
Как правило, текущие занятия волнуют вас больше, чем планы на будущее
Если вы согласились с бо́льшим числом пунктов из списка А, чем Б, вы, должно быть, абстрактно ориентированы. И наоборот, если преобладали утверждения из списка Б, вы относитесь к конкретному типу личности.
[Сразу хочу оговориться. Во-первых, тип личности – это не судьба. Очень часто жизнь требует от нас адаптировать свое поведение ради семьи, работы, друзей и т.п. Во-вторых, вполне может оказаться, что в зависимости от вашей текущей ситуации вы можете отвечать на одни и те же вопросы по-разному. В-третьих, речь идет об описании вашего доминирующего стиля мышления – не нужно воспринимать это как призыв к действию.]
Адаптируем мышление
Несколько лет назад я услышал хорошую аналогию. Вы можете быть правшой или левшой. Большинство людей используют одну руку в качестве основной, некоторые свободно владеют обеими. Но только из того, что кто-то чаще пользуется правой рукой, не следует, что ему вообще не нужна левая. Кроме того, некоторые задачи требуют использования определенной руки – попробуйте воспользоваться ножницами для правшей левой рукой или вести машину, переключая скорости не той рукой, которая предполагалась производителем.
Мы все умеем обращаться как с фактами, так и с обобщенными шаблонами, но чаще имеем склонность к чему-то одному. Точно так же, существуют задачи, для решения которых больше подходит определенный тип мышления. По своему опыту могу сказать, что программисты становятся сильнее, когда понимают свои природные склонности, но учатся адаптироваться при необходимости.
Вот несколько примеров задач, в которых отдается предпочтение определенным типам мышления (все они являются обобщениями)
Разработка пользовательского интерфейса требует внимания к большому количеству деталей
Спецификации выигрывают от широкого мышления, но могут быть подкреплены конкретными примерами (в качестве тестов обобщений, удобочитаемость улучшается, когда приводятся конкретные примеры, что позволяет убедиться, что обобщения не потеряли связи с реальностью)
Масштабируемые системы и архитектуры с большим жизненным циклом требуют абстракций
Объектно ориентированное программирование ориентировано на абстракции
Коллеги, не являющиеся программистами, и заказчики могут оказаться с конкретным типом мышления. Абстрактно мыслящий человек, общаясь с конкретно мыслящим, рискует оказаться недопонятым, произвести впечатление летающего в облаках. Если вы мыслите абстрактно, хорошо бы научиться общаться с другими людьми на понятном им языке.
Я не ставил перед собой цели показать, какой стиль мышления лучше. Вместо этого я отстаиваю идею самоосознания и тренировки гибкости в мышлении и общении.
Будучи стопроцентным абстракционистом, хочу закончить прекрасным примером абстрактного мышления
Все обобщения ложны. Включая это. Марк Твен
А Марк Твен был абстрактно ориентированным писателем…