Программист на всю голову: как кодинг влияет на мышление
Научиться программировать — значит не только развить полезный навык, но и приобрести особый тип мышления. Программисты умеют хорошо решать математические и логические задачи. Также они обращают внимание на детали, моделируют ситуации в обычной жизни и дают оценку на основе большого количества факторов.
В преддверии нашего курса Go Workshop рассказываем, что психологи, лингвисты и педагоги думают о влиянии кодинга на мозг, при чем тут австралийские индейцы и гипотеза Сепира-Уорфа.
В 30-х годах прошлого века появилась, названная по аналогии с открытием Эйнштейна, теория лингвистической относительности. Она гласит: язык определяет сознание, то есть люди воспринимают мир неодинаково, потому что лингвистические категории родного языка накладывают ограничения и даже определяют мышление.
Эту мысль сформулировали Эдвард Сепир и его ученик Бенджамин Уорф, однако они были не правы. Любую идею можно передать на любом языке. Они же приписывали колоссальное влияние на когнитивные процессы простым различиям в грамматике, но при этом концепция содержала и здравое зерно. Гай Дойчер в своей книге «Сквозь зеркало языка» объясняет, какое:
«Если разные языки по-разному влияют на мышление своих носителей, то тут дело не в том, что каждый язык позволяет думать своим носителям, а скорее в тех частях смысла, о которых каждый язык обычно заставляет думать. Когда язык принуждает своих носителей обращать внимание на отдельные аспекты мира… такие привычки речи могут в конце концов стать привычками мышления с последствиями для памяти, восприятия, ассоциаций и даже практических навыков».
Истина где-то к северу
Убедительно доказано, что система родов существительных влияет на ассоциативные ряды, вынуждает наделять те или иные неодушевленные объекты воображаемыми женскими или мужскими чертами. Похожий эффект связан с различиями в чувствительности к оттенкам цветов, для которых в языке есть название.
Но это мелочи по сравнению с тем, что язык может формировать навыки. Это выяснилось при изучении одного из языков австралийских аборигенов. Они вместо привычных «спереди» и «сзади», «лево» и «право» для указания направления используют исключительно стороны света.
Это могло бы показаться розыгрышем, но если носитель этого языка попросит вас освободить место на лавочке, то это будет звучать как «подвинься, пожалуйста, восточнее». Если при этом вы читаете книгу, сидя лицом к югу, и абориген захочет, чтобы вы перелистнули на пару страниц вперед, то вы услышите «листай дальше на запад». Если же развернуться лицом к северу, просьба будет звучать по-другому — вас попросят листать на восток.
Чтобы говорить на этом языке, приходится постоянно отслеживать расположение сторон света, что формирует географическую память и не требующее сознательного контроля чувства направления. Так, глубокое изучение языка — больше чем просто знание грамматики и лексики.
Изучение влияния языка на мышление еще только начинается, но уже идут схожие исследования языков программирования, которых роднит с естественными не только название.
Программирование ≥ речь
Вопреки стереотипам, в программировании наиболее важны не математические способности, а лингвистические. Об этом еще в 1982 году в своих «Этюдах для программистов» писал Чарльз Уэзрел. Он обратил внимание на вербальные способности как на важный аспект личности успешного программиста, имея в виду умение работать с грамматикой как искусственных, так и естественных языков.
Его наблюдения подтверждаются. Статистические исследования выявили корреляцию между программированием и высокими лингвистическими способностями. Непосредственные наблюдения за активностью в различных зонах мозга при помощи МРТ установили, что во время работы над кодом активируются те же отделы мозга, что отвечают за естественные языки.
Не удивительно, что многие программисты считают гипотезу Сапира-Уорфа применимой к их работе. Подобных взглядов придерживался Кеннет Айверсон, создатель APL. Юкихиро Мацумото признавался, что при разработке Ruby, вдохновлялся романом «Babel-17», основанным на гипотезе лингвистической относительности.
Схожие мотивы развиваются в эссе «Побеждая посредственность» Пола Грэма, в его парадоксе «Blub», согласно которому программист, овладевший одним языком и решающий с его помощью все задачи, не понимает ценности более эффективных инструментов из других языков программирования, воспринимая их как нечто странное, непривычное и ненужное.
Первую попытку обобщить имеющиеся данные по влиянию программирования на когнитивные процессы, предприняли в 1987 году в майском номере журнала Educational Computing Research.
Тогда исследователи подметили, что программирование с его разнообразными задачами может положительно влиять на умение стратегически решать задачи, на способности к формальной логике, на навыки моделирования и на когнитивные стили, но к однозначным и доказательным выводам так и не пришли из-за недостатка данных.
Еще шесть лет прошло, прежде чем была собрана статистика, которая позволила конкретизировать представления о влиянии кодинга на мышление. Она представлена в метаанализе шестидесяти пяти исследований о влиянии программирования на когнитивные процессы, опубликованном в 1991 году.
Оказалось, что в большинстве случаев программирование действительно положительно влияет на различные познавательные навыки, коррелирующие с длительностью изучения языка программирования и успехами в нем. «Последствия изучения языка программирования выходят за рамки содержания конкретного компьютерного языка», — утверждают ученые. С умением программировать улучшаются навыки планирования, способность к построению рассуждений, логическое мышление, а также общие навыки решения проблем с помощью компьютерных программ.
Сравнительные исследования влияния различных языков программирования на познавательные процессы продолжаются. На анализ содержимого онлайн-репозиториев Github и BitBucket, вопросов и ответов, размещенных на StackExchange выделено 750 тысяч долларов гранта. По ним Knowledge Lab и Department of Psychology Висконсинского университета Мадисона восстановят «естественную историю» языков программирования, отследят, как часто и для каких целей используется каждый из них.
К 2020 году исследователи планируют выяснить, как специфические особенности языков программирования влияют на число путей и скорость решения различных задач, проанализируют насколько хорошо тот или иной язык подходит для коллективного программирования.
Перед проектом поставлена амбициозная задача: предоставить информацию о том, какие языки стоит выбирать для конкретных проектов, и выяснить, насколько этот выбор влияет на то, как разработчики думают и работают.
Больше чем навык
Помимо собственно навыков программирования, изучение языков формирует привычку к тому, что математик, психолог и программист Сеймур Паперт в своих работах называет «вычислительным мышлением».
Это — гибкий набор навыков, нацеленных на алгоритмическое решение задач, привычка комплексно использовать в повседневной жизни абстрагирование, декомпозицию, оценку, логическое мышление, точность и привычку замечать детали.
Концепция вычислительного мышления приобрела авторитет в педагогике, легла в основу многих образовательных программ, но со временем, как и предполагалось в восьмидесятых годах прошлого века, ее влияние распространилось далеко за пределы колледжей и ВУЗов.
С помощью методологии программирования успешно решаются самые разнообразные проблемы. Примером тому служат не только компьютерное моделирование, сбор больших данных, внедрение автоматизированных систем, успехи финтеха.
Вычислительное мышление применимо и полезно в повседневной жизни и для профессионалов, далеких от IT-технологий. Изучение программирования помогает найти новые подходы и решения, о чем бы ни шла речь. Будь то физика, биология, химия, социология, педагогика, бизнес или здравоохранение.
Так появилась концепция эффективного альтруизма, начались поиски наиболее эффективных стратегий благотворительности. Благодаря этим исследованиям выяснилось, например, что в борьбе с малярией эффективнее жертвовать деньги на антимоскитные сетки, а не дорогие лекарства.
Другое следствие вычислительного мышления — идея использовать инструменты математического анализа бартерных сделок и большие данные для решения проблемы подбора доноров органов. В результате разработан дизайн действующей в США сложной и в тоже время надежной и эффективной системы обмена донорскими почками «по цепочке» за который профессор Гарвардского университета Элвин Рот в 2012 году получил Нобелевскую премию.
В контексте новых исследований, изучение языка программирования — не просто получение навыка, но и способ по-новому взглянуть на жизнь, по-новому справляться с вызовами, что она ставит.
Совсем скоро в Binary District стартует курс Go Workshop — отличный старт для начинающих программистов и логическое продолжение для тех, кто уже сталкивался с проектированием собственных веб-сервисов.
Источник
Абстрактно ориентированный программист
Начну с истории о программистах, которую мне приходилось слышать неоднократно.
Я попросил Джо написать простенькую программу, которая делает <xyz>. Работы там было на несколько часов, в худшем случае на день. Ему понадобилось несколько дней, за который он написал гораздо более сложный фреймворк, чем требовалось. Почему он снова так намудрил?
Возможно, дело в том, что Джо – Абстрактно ориентированный программист (АОП ) .
Вот несколько шаблонных фраз (snowclones)
Если вы часто усложняете (over-engineer) свои программы, возможно вы АОП .
Если вы проводите больше времени, размышляя о завтрашних проблемах, чем о текущих, возможно, вы АОП >.
Если вам нравится искать глубинные взаимосвязи, ощущать приятную дрожь от бессознательных озарений или рассуждать аналогиями, возможно, вы АОП .
Необходимость абстракций
Разработка программного обеспечения – одно из немногих занятий в котором постоянно приходится иметь дело с абстракциями. Языки программирования, типы данных, графические представления, потоки управления и т.д. являются абстракциями реального мира, абстракциями аппаратного обеспечения и часто абстракциями абстракций.
Резкий рост производительности процессоров (в соответствии с законом Мура) рождает потребность в абстракциях. Я начинал программировать на компьютерах с процессорами, счет транзисторов в которых шел на сотни. У Motorolla 6800 было 4100 транзисторов и тактовая частота 1-2 мегагерца. Zilog Z80 имел 8500 транзисторов и частоту 2-8 МГц. Понимание работы регистров процессора, прерываний и других в каком-то смысле физических процессов очень сильно помогало, когда требовалось заставить эти компьютеры делать что-нибудь действительно полезное.
Сейчас в массовое производство запущены процессоры с миллиардом или около того транзисторов. Например Intel Core i7 содержит около миллиарда транзисторов, и имеет тактовую частоту 2-3.5 ГГц.
Это, примерно, в миллиард раз превосходит вычислительную мощность компьютеров тридцатилетней давности. Человек же так заметно эволюционировать не сумел. Возникла необходимость эффективно использовать прирост мощности процессоров. Тут-то и появились компиляторы, виртуальные машины, сложные интерфейсы, всевозможные оптимизаторы, высокоуровневые языки программирования и другие инструменты. Между аппаратным обеспечением и современными программами лежит множество слоев абстракции. И, конечно же, они необходимы.
Таким образом, нет ничего удивительного в том, что программирование привлекает людей со склонностью к абстрактному мышлению… и, возможно, человек с абстрактным мышлением имеет больше шансов получать удовольствие от работы и добиваться успехов в этой области.
Но, рассуждая подобным образом, очень легко забыть, что не всем людям свойственно абстрактное мышление. Можно даже сделать вывод, что все программисты абстрактно ориентированны или ошибочно заключить, что абстрактное мышление является наилучшим вариантом для них.
Абстрактное мышление
Для начала рассмотрим определения
Абстрактный (прилагательное)
- отвлеченный, не связанный с непосредственным восприятием реального мира (т.е. фактами)
- не прикладной или практический, теоретический
Абстракция (существительное)
- процесс формулирования обобщенных идей или концепций посредством извлечения общих свойств или закономерностей из определенного набора примеров
Абстракции – это по определению упрощение информации, которое достигается рассмотрением большого количества примеров и сжатием их в общий шаблон.
Для некоторых людей естественно абстрактное мышление, в то же время другие предпочитают конкретные факты. Абстрактно выражаясь, речь идет о способе, которым люди обрабатывают информацию.
Рассмотрим индикатор типов личности Майерс-Бриггс, который широко используется в бизнесе. Индикатор позволяет определить четыре типа личности, которые подразделяются на основанные на интуиции и здравом смысле (N и S, если использовать обозначения типологии) – соответственно на абстрактное и конкретное мышление. (Существуют другие психологические исследования с похожим разделением типов личности)
Перечислим некоторые особенности, проявляющиеся при абстрактном и конкретном мышлении.
Ввиду того, что многие люди подстраивают свое поведение под обстоятельства, вы также можете трактовать приведенную информацию как абстрактное или конкретное текущее состояние сознания, хотя считается, что каждый человек имеет доминирующую склонность.
Признаки абстрактного/интуитивного мышления
Признаки конкретного мышления
Вернемся к Джо
Вернемся к истории о Джо, с которой начиналась данная статья, где он усложнял (over-engineer) код. Для абстрактно ориентированного программиста тут все логично
- Сегодня мы имеем проблему X
- X – это отдельный пример более общего класса задач, который также включает Y и Z
- Чтобы проблемы Y и Z не случились в будущем, я должен написать код, который решает X, Y и Z
Однако, когда во время общения с Джо мы попросили его решить только задачу X, в то время как он знал, что в будущем Y и Z неминуемы, мы обрекли его на расстройство из-за некачественно выполненной работы или даже уверенность, что в будущем его сделают крайним.
Здесь на первый план выходит текущая ситуация. Умение думать наперед может сделать из вас героя. Также умение думать наперед с легкостью превратит вас в обузу. Концентрируясь же исключительно на сиюминутных проблемах, вы станете героем… или обузой.
Весь фокус в понимании, какой подход будет уместным в той или иной ситуации, проще говоря, адаптируйтесь.
Также очень важно согласовывать выбранную стратегию с коллегами, другими словами, общайтесь.
Приведу некоторые отзывы, которые я слышал об абстрактно ориентированных программистах…
Позитив
Негатив
- Он постоянно сражается с будущими проблемами, я не могу заставить его сделать быструю правку, когда это необходимо
- Она часто сильно усложняет (over-engineer) свой код. Иногда мне нужен просто быстрый хак.
- Он постоянно пытается переписать всю нашу кодовую базу. Унаследованный код работает – просто оставь его в покое.
- Почему она не следует общему плану работ
- Совещания нашей команды (АОП ) постоянно уходят от насущных проблем. Конечно, обсуждения получаются интересными, но нам нужно сконцентрироваться на решаемой задаче.
… и то же самое про конкретно ориентированных программистов (КОП )
Позитив
Негатив
- Его код решает узкий круг задач. Этого достаточно, чтобы пройти тесты, но мало для реального использования
- Ее код негибок и труден в сопровождении. Каждый раз при добавлении новой функции мы вынуждены все переписывать заново.
- Он ничего не видит за пределами текущей задачи. Его код не протянет долго.
Мини тест
Список А. Сколько из приведенных в нем пунктов описывают вас наилучшим образом? (Отвечайте не задумываясь)
- Вас больше интересует идея в общем, чем тонкости ее реализации
- Вы часто задумываетесь о судьбе человечества
- Вы с легкостью выделяете общие закономерности из конкретных примеров
- Вы часто рассуждаете о сложности жизни
- Вы считаете, что практически все поддается анализу
- Вы с легкостью понимаете новые теоретические принципы
- Вы часто проводите время за размышлениями, как сделать что-либо лучше
- Вы с легкостью просчитываете разные пути, по которым может пойти развитие ситуации
Список Б. Сколько из приведенных в нем пунктов описывают вас наилучшим образом?
- Вам скучно читать теоретические книги
- Вы предпочитаете опираться на свой опыт, а не на теоретические альтернативы
- Для вас важно пробовать сделать что-то своими руками
- Анализируя ситуацию, вы основное внимание уделяете текущему ее состоянию, а не возможным последствиям
- Как правило, текущие занятия волнуют вас больше, чем планы на будущее
Если вы согласились с бо́льшим числом пунктов из списка А, чем Б, вы, должно быть, абстрактно ориентированы. И наоборот, если преобладали утверждения из списка Б, вы относитесь к конкретному типу личности.
[Сразу хочу оговориться. Во-первых, тип личности – это не судьба. Очень часто жизнь требует от нас адаптировать свое поведение ради семьи, работы, друзей и т.п. Во-вторых, вполне может оказаться, что в зависимости от вашей текущей ситуации вы можете отвечать на одни и те же вопросы по-разному. В-третьих, речь идет об описании вашего доминирующего стиля мышления – не нужно воспринимать это как призыв к действию.]
Адаптируем мышление
Несколько лет назад я услышал хорошую аналогию. Вы можете быть правшой или левшой. Большинство людей используют одну руку в качестве основной, некоторые свободно владеют обеими. Но только из того, что кто-то чаще пользуется правой рукой, не следует, что ему вообще не нужна левая. Кроме того, некоторые задачи требуют использования определенной руки – попробуйте воспользоваться ножницами для правшей левой рукой или вести машину, переключая скорости не той рукой, которая предполагалась производителем.
Мы все умеем обращаться как с фактами, так и с обобщенными шаблонами, но чаще имеем склонность к чему-то одному. Точно так же, существуют задачи, для решения которых больше подходит определенный тип мышления. По своему опыту могу сказать, что программисты становятся сильнее, когда понимают свои природные склонности, но учатся адаптироваться при необходимости.
Вот несколько примеров задач, в которых отдается предпочтение определенным типам мышления (все они являются обобщениями)
- Разработка пользовательского интерфейса требует внимания к большому количеству деталей
- Спецификации выигрывают от широкого мышления, но могут быть подкреплены конкретными примерами (в качестве тестов обобщений, удобочитаемость улучшается, когда приводятся конкретные примеры, что позволяет убедиться, что обобщения не потеряли связи с реальностью)
- Масштабируемые системы и архитектуры с большим жизненным циклом требуют абстракций
- Объектно ориентированное программирование ориентировано на абстракции
- Коллеги, не являющиеся программистами, и заказчики могут оказаться с конкретным типом мышления. Абстрактно мыслящий человек, общаясь с конкретно мыслящим, рискует оказаться недопонятым, произвести впечатление летающего в облаках. Если вы мыслите абстрактно, хорошо бы научиться общаться с другими людьми на понятном им языке.
Я не ставил перед собой цели показать, какой стиль мышления лучше. Вместо этого я отстаиваю идею самоосознания и тренировки гибкости в мышлении и общении.
Будучи стопроцентным абстракционистом, хочу закончить прекрасным примером абстрактного мышления
Все обобщения ложны. Включая это. Марк Твен
Источник