Как программирование влияет на мозг: три научных факта
Учёные считают, что программирование не просто нагружает мозг — оно его меняет, заставляет думать иначе. Рассказываем, как именно.
Ниши Кашьяп
(Nishi Kashyap)
Пишет о технологиях, стартапах и предпринимательстве.
Сын спросил своего отца-программиста:
— Пап, почему солнце встаёт на востоке и заходит на западе?
— Работает? Вот и не трогай ничего.
Фулстек-разработчик. Любимый стек: Java + Angular, но в хорошей компании готова писать хоть на языке Ада.
Программисты на самом деле думают по-особенному. Про это даже целая книга написана: «Думай как программист: введение в решение творческих задач».
На русском языке эта книга Антона Спрола (V. Anton Spraul) издана под названием «Думай как программист. Креативный подход к созданию кода. C++ версия».
Автор считает, что настоящий программист к решению любой задачи должен подходить организованно: составлять план с учётом своих сильных и слабых сторон и следовать ему.
При этом не обязательно изобретать решение с нуля — важно научиться применять готовые наработки. Но опять же — делать это надо грамотно. То есть не бездумно копировать чужой код, а разбираться в алгоритмах, шаблонах проектирования, учиться видеть общее в разных проблемах.
Сам создатель Apple, Стив Джобс, говорил: «Программирование учит вас думать».
Программисты не просто пишут простыни кода или что-то там разрабатывают. Им приходится решать сложные задачи, подключать логику и мыслить нестандартно. Проявляется это даже в профессиональных шутках.
«Программирование похоже на секс: одна ошибка — и вам придётся поддерживать результат всю жизнь».
В разработке программного обеспечения поддержка (support) — это когда компания-разработчик консультирует пользователей своих продуктов, помогает с настройкой программ и исправляет ошибки в их работе.
Майкл Синц, конечно, не считает ребёнка ошибкой. Он говорит о беспечности и её результате: в одном случае это плохой код, а в другом — дети, которых родители нередко поддерживают всю жизнь.
Учёные много лет копаются в мозгах у программистов, чтобы узнать, что там происходит и чем этот самый программерский мозг отличается от прочих.
В конце концов они выяснили, что программирование как интеллектуальная деятельность влияет на то, как человек думает.
Факт №1
Программирование активизирует центры обучения в мозге
Согласно исследованию доктора Джанет Зигмунд (Janet Siegmund), одного из ведущих мировых экспертов в области создания исследовательских компьютерных программ, анализ программного кода активизирует в мозге сразу пять зон.
Они связаны с обработкой естественного языка, рабочей памятью и вниманием.
То есть при восприятии исходного кода активны части мозга, которые связаны с обработкой языка, памятью и вниманием, и почти не задействованы центры, ассоциированные с математикой и вычислениями.
Когда эти зоны используются часто, нейронных связей между ними становится всё больше и больше. Это похоже на протаптывание тропинки. (По такому же принципу улучшается мышечная память при регулярном повторении монотонных движений.) В результате мозг быстрее реагирует на изменения, а мы быстрее обучаемся.
Японские учёные в другом эксперименте выяснили, что чем выше квалификация программиста, тем более активны эти зоны и менее нагружены все «неспецифические».
« Есть так много способов научиться программировать: от самостоятельного обучения до курсов. А вот мозговые зоны у людей, когда они работают с кодом, всегда активизируются одни и те же. Это удивительно», — подвёл итог Юнь-Фэй.
В этой серии экспериментов учёные сравнивали, какие зоны активируются при анализе программного кода и при решении других задач: на логику, математику и понимание естественного языка.
Выяснилось, что программистские задачки по рисунку активации похожи на логические (левый лобный полюс) и математические (внутритеменная борозда и правый лобный полюс), в то же время при восприятии кода больше включаются «лингвистические» отделы мозга.
Занятия вроде программирования стимулируют мозг, это отличная тренировка для него. Они улучшают способность запоминать информацию и решать задачи.
Поскольку задачи программиста сложны и многогранны, они требуют аппарата себе под стать. Так, написание кода меняет мозг, усиливает нейронную связанность между разными его областями. Есть мнение, что такой мозг лучше способен проявлять креативность, хорошо анализировать проблемы, мыслить логически, да и в целом быстрее обучается.
От переводчика
Любопытство учёных распространяется не только на программистов. Частенько достаётся и шахматистам, и переводчикам-синхронистам, и музыкантам.
Например, в этом исследовании с помощью фМРТ-сканера наблюдали за мозгом профессиональных пианистов.
Снимки показали, что при музыкальной импровизации так же, как и в случае с программированием, активизируются зоны префронтальной коры, отвечающие за речь. Кроме них, активны были сенсомоторные области, а также угловая извилина — она вовлечена в процессы, связанные с восприятием пространства, памятью, вниманием и психическим состоянием человека.
Другие исследователи, Цюньлинь Чэнь (Qunlin Chen) и его коллеги, пошли дальше и решили сравнить музыкальное, литературное и художественное творчество — то есть сразу три вида деятельности.
Эти специалисты Университета штата Пенсильвания провели метаанализ 21 эксперимента, включающего фМРТ-сканирование мозга творческих людей, выявили сходства и различия в рисунке активации зон.
Оказалось, что при всех трёх видах творчества значительно активизировались три отдела мозга, ассоциированные с моторными функциями, рабочей памятью и речью. Две из них упоминались и в исследовании Джанет Зигмунд, а вот моторика при программировании, похоже, играет не такую большую роль. Наверное, потому что мастерство программиста измеряется не числом напечатанных строк кода, а качеством этого кода 
Факт №2
Программирование меняет мышление
«Инструменты, которыми мы пользуемся, незаметно для нас самих, но неотвратимо влияют на наши ментальные привычки, а значит, и на мыслительные способности».
Само устройство языка программирования, без сомнения, меняет образ мышления тех, кто с этим языком работает.
Я говорю не просто о написании строчек кода, а об ином мышлении, которое нужно для создания этих строчек. То есть о том, чтобы взять какие-то смутные концепции и превратить их во что-то конкретное и понятное — представить в виде кода, который решает задачу.
Проведём эксперимент. Попробуйте прочесть это сообщение:
«По рзеульаттам илссеовадний Кмедгижобрксо унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, всё рвано ткест чтаитсея без побрелм. Это потмоу, что мы чиатем не кдаужю бкувy по отдльенотси, а всё солво цликеом».
Получилось? Конечно же вы поняли смысл текста, несмотря на бардак с буквами. (Это явление называется типогликемией.) А удалось это потому, что обычно люди читают не буквы по отдельности, а слова целиком.
Это не совсем верно.
1. Кембриджский университет не проводил исследования, о котором автор говорил выше. Этот текст — популярный мем.
2. Не так всё просто и с перестановкой букв: чтобы понять слова, значима не только позиция первой и последней буквы. Важно ещё:
3. Есть мнение, что, наряду с выделением слов целиком, глаз при сканировании текста всё же считывает и отдельные буквы.
Подход с чтением слова целиком не годится для программирования: там бесполезно писать srting вместо string, несмотря на то, что ваш мозг в любом случае поймёт написанное.
Мне кажется, что эта особенность при работе с кодом, когда читать приходится все отдельные символы, а не слова и предложения сразу, развивает иной способ мыслить.
Это переносится и на более высокие уровни мышления: даже считывая смысл целиком, нельзя забивать на детали. Когда программист пишет код, ему нужно действовать способами, подходящими для опредёленного контекста, — начиная с корректного синтаксиса и правильных названий для всего и вся. Одна маленькая ошибка — и программа не заработает (или будет работать неверно).
Внимание к деталям пригодится и в повседневной жизни. Если тренировать этот навык не только на работе и чаще «думать как программист», вы не пропустите новый дорожный знак, даже если уже пять лет ездите по одной дороге, а знак поставили только вчера. А ещё не придётся срочно бежать в магазин за переходником, потому что вы по недосмотру купили роутер с китайской вилкой.
Если прислушаться к советам Антона Спрола и перед решением хотя бы самых важных бытовых задач составлять план и учитывать свои сильные и слабые стороны, возможно, вам даже удастся завершить в срок ремонт в квартире. Деньги и стройматериалы не закончатся в самый разгар мероприятий, а соседи снизу не подадут на вас в суд за то, что вы взялись сами устанавливать унитаз (без опыта сантехнических работ) и затопили их.
Кроме того, программирование приучает ожидать подвоха там, откуда не ждали, — пользователи, а до них тестировщики, не всегда используют приложение так, как задумывали его создатели: жмут не на те кнопки и не в то время, вводят некорректные данные и тому подобное. Наверное, поэтому настоящий программист всегда смотрит в обе стороны, прежде чем перейти дорогу. Даже если это дорога с односторонним движением 
Львиная доля работы программистов приходится на отладку кода — поиск и исправление ошибок в нём. И тут им тоже приходится быть начеку. Ведь, как говорится в известной шутке, отладку кода можно сравнить с детективом, где программист сразу и следователь, и свидетель, и главный подозреваемый.
В программировании важны не только логика и математика — чтобы создавать что-то новое, нужен творческий подход, умение мыслить нестандартно. Именно в этом направлении и развиваются мыслительные процессы.
Факт №3
Программирование улучшает память и когнитивные навыки
С возрастом ухудшается наша способность запоминать новое и память в целом, но в одном из исследований учёные обнаружили, что «интеллектуальные занятия служат буфером, который сглаживает когнитивный спад».
Проще говоря, занятия, которые требуют значительных умственных усилий, такие как программирование, помогают бороться с потерей памяти и укреплять здоровье мозга.
К слову, деменция может настигнуть не только в старости: ранняя деменция диагностируется у людей в возрасте от 30 лет. Учёные считают, что риск её снижается, если питаться сбалансированно, поддерживать физическую активность и активность мозга.
Программирование — отличная зарядка для ума. И вряд ли хуже решения кроссвордов, изучения иностранных языков или разгадывания головоломок. Ведь, согласно этому исследованию, программирование соответствует всем критериям мыслительной деятельности, которая действительно улучшает мозг:
В человеческом мозге два полушария: левое и правое. Правое отвечает за интуицию и воображение, левое — за аналитическое и логическое мышление.
При программировании задействованы функции обоих полушарий, поэтому оно развивает мозг комплексно. Оно усиливает когнитивные способности, которые отвечают за обучаемость, преодоление интеллектуальных трудностей, запоминание информации.
Кажется, здесь автор повторяет популярный миф о том, что левое и правое полушария работают по-разному. Эта теория появилась во второй половине XX века с лёгкой руки лауреата Нобелевской премии Роджера Сперри.
Позднее учёные выяснили, что, каким бы делом ни был занят человек, в нём участвуют оба полушария, причём разные зоны — в зависимости от вида деятельности, но вот доминирующих сторон не наблюдается. Например, в этом исследовании нейробиологи сделали магнитно-резонансную томографию тысяче человек, чтобы опровергнуть подобные заблуждения.
По словам Алана Перлиса, лауреата премии Тьюринга и автора языка Алгол, изучение языка программирования меняет восприятие программирования в целом. А если не меняет, то « изучать такой язык разработки не стоит вовсе». Также он заявлял, что « программирование дисциплинирует мышление, учить планировать, уделять внимание деталям и быть самокритичным».
Послесловие от переводчика
Программирование — сложное интеллектуальное занятие, благодаря которому возникают и крепнут связи между различными областями мозга.
Кроме того, при написании кода приходится прилагать дополнительные усилия, чтобы держать в голове задачу целиком и не забывать о деталях — таких, как синтаксис, например.
В итоге программирование не только учит решать нестандартные задачи, оно тренирует навыки, которые нужны в повседневной жизни, — вроде внимания к деталям и бдительности, а ещё служит профилактикой деменции.
обложка: Полина Суворова для Skillbox Media
фМРТ (функциональная магнитно-резонансная томография) показывает относительную активность различных областей мозга, а не его структуру. Делается это с помощью магнитных полей. Во время фМРТ видны области мозга, в которых ток крови ускоряется (им требуется больше кислорода и глюкозы) при разных видах мыслительной активности.
Премия Тьюринга — самая престижная премия, которая вручается за выдающиеся достижения в области информатики. Она названа в честь Алана Тьюринга — английского математика, логика и криптографа. В частности, он известен тем, что во время Второй мировой войны взломал немецкий шифратор Enigma.
Эдсгер Вибе Дейкстра — голландский учёный. Он внёс большой вклад в развитие информатики: придумал алгоритм обхода графов (назван в его честь), участвовал в создании языка Алгол, операционной системы THE. Называл себя программистом, когда такой профессии даже не было.
Чем же занимаются программисты, и как объяснить это остальным?
Наверное, у каждого программиста возникала ситуация, когда совершенно не знакомые с IT люди просили его объяснить, в чём же состоит суть его профессии. Так уж сложилось, что у большинства людей понятие «программист» ассоциируется либо с замкнутым гиком в очках и свитере, либо с неким гениальным красноглазым подростком-хакером — но при этом никто не знает, чем именно он занимается.
Как рассказать им об этом, не пугая страшными терминами и фрагментами кода?
Под катом я воспроизведу такой рассказ, а также развенчаю несколько мифов о программировании.
— Чем занимаются программисты? Это не так-то просто рассказать… Ответьте мне для начала: как в двух словах можно описать, например, суть профессии хирурга?
— Хирург проводит операции.
— Да, отличное описание! Ну а, скажем, футболиста?
— Играет в футбол!
— Угу, а хирург «занимается хирургией». А если без однокоренных слов?
— Пинает мяч?
— Вот это точно. А что же делает программист, кроме как «разрабатывает программы»?
— …
— Программист пишет код. Исходный код своей программы, составленный на каком-то специальном языке программирования. Точнее говоря, сначала он продумывает структуры своих данных, потом составляет алгоритмы для работы с этими структурами — ну а затем уже представляет это в виде кода.
— Что ещё за «структуры данных»? Разве он не управляет компьютером, не нажимает кнопки?
— Эх.
Миф №1: программист работает с компьютерами
Попробуйте донести до людей, что программисту для написания кода, в общем-то, совсем не нужен компьютер. Он нужен лишь для проверки корректности кода, для его тестирования — но писать сам код и составлять схемы алгоритмов вполне можно и на бумаге (хотя на экране монитора, конечно, это делать удобнее). Разработчик же просто записывает на этой бумаге набор каких-то инструкций, команд или конкретных данных (числа, текст). А кто этот набор исполняет — компьютер, телефон или особо умный робот, не так уж и важно. Программист работает с данными, а не с машинами.
— Ну как, понятно?
— То есть, программист просто сообщает машине, что бы он хотел сделать — а она это исполняет?
— Ну да, примерно.
— Так же, как начальник отдаёт распоряжения подчинённым?
— Вроде того.
— А если машина захочет исполнить это как-то по-другому?
— В смысле?
— Ну, что-то ей не понравится. Или просто исполнять не захочет.
— Так, давайте уясним раз и навсегда, что.
Миф №2: машина умеет думать
Почему-то немалое число людей реально считает, будто компьютер обладает каким-то интеллектом. На самом деле — это просто набор железок, которые думать не умеют. Они умеют лишь хранить числовые данные. Размагничен какой-то участок такой железки — значит, это ноль. Намагничен — единица. Плюс, ещё они могут складывать и вычитать эти единицы, образуя более сложные числа (о двоичной системе счисления лучше не стоит упоминать). Больше компьютер сам ничего делать не умеет, только хранить числа и оперировать ими. Это бездумный болван, который лишь выполняет команды программиста.
— В общем, код любой программы представляет собой набор команд, а компьютер их тупо исполняет.
— То есть, он не понимает сути самих команд? Но как он воспринимает текст, который я ввожу на экране?
— Когда ты крутишь педали на велосипеде — понимает ли он, что ему сейчас нужно поехать вперёд?
— Нет, но ведь едет. Поскольку его цепь преобразует вращение педалей во вращение колёса.
— Именно! Также и компьютер преобразует введённый тобой текст в набор чисел.
— Каким образом?
— У каждого символа текста есть свой числовой код, который знает компьютер. Это называется кодировкой. Например, английская «a» кодируется числом 97, а знак равенства — числом 61.
— Поэтому машина и может понимать текст, который мы ей сообщаем?
— Нет, она «понимает» не смысл. А лишь то, каким образом этот текст хранить, и как к нему обращаться.
— Выходит, сначала мы вводим текст, затем компьютер разбивает его на символы, а каждый символ уже представляет в виде числа?
— Верно. Сложные структуры представляются в виде более простых, которые и «понимает» машина.
Скажите мне, из чего состоит жилой дом?
— Ну… Из этажей.
— А из чего состоят этажи? И так далее.
— Этажи — из стен. А стены — из кирпичей. А кирпичи…
— Вот числа для компьютера — это то же, что и кирпичи для дома. Символы — это стены. Отдельные предложения — этажи. А книги — целые дома! Но у программистов есть преимущество перед строителями.
— Какое?
— Строитель не может строить целыми этажами, он вынужден всегда класть кирпичи. Даже если некий сверхмощный подъёмный кран позволит ему строить готовые этажи, он не сможет строить им целые дома или жилые кварталы. А программист сможет! Раз он уже «обучил» машину понимать конечный текст — то, по сути, он «обучил» подъёмный кран строить готовый дом за одно действие.
— То есть, программист может использовать всё более и более сложные структуры данных?
— Да. Поэтому первая из составляющих его работы — представить понятные человеку данные (текст, изображение, звук) в виде объединения более простых данных, уже понятных компьютеру. Разработчик практически «с нуля» составляет структуру, которая должна полностью описывать понятную человеку вещь — причём таким образом, чтобы эта структура была легко расширяемой и изменяемой (ведь в программу часто приходится вносить какие-то новые возможности).
— Хех! Выходит, что он строит резиновые дома из съёмных панелей!
— Примерно так. Однако, ещё ему придётся не только описать, что же ему нужно построить — но и как всё это построить. То есть, придумать алгоритм. Это вторая из составляющих его работы.
— Программист придумывает алгоритм на каждое действие?
— Именно. Поэтому алгоритмов получается очень много. Но его работу облегчает то, что одни действия могут содержать в себе другие, уже описанные им ранее.
— И здесь ему на помощь приходит язык программирования?
— Не совсем.
Миф №3: язык программирования нужен для составления алгоритмов
Нет, язык — это всего лишь инструмент. Как гитара для музыканта. Само по себе умение играть на гитаре вовсе не гарантирует славы — потому что люди, как правило, восхищаются самой музыкой, а не умением быстро и чётко дёргать струны. С другой стороны, вряд ли кто придёт посмотреть на плохого гитариста, какую бы замечательную композицию он не исполнял. Также и с ЯП: знание его синтаксиса и связанных с ним нюансов очень важно, равно как и умение писать красивый и ясный код. Однако, если человек не умеет составлять алгоритмы и структуры данных — то он не может называться хорошим программистом.
Компьютер не понимает язык программирования напрямую. Как и ранее, он представляет каждую команду языка в виде набора «простейших» команд (сохранить число, обнулить число, прибавить к нему единицу), которые он способен исполнить. «Понимает» язык программист, а машина его лишь исполняет. По сути, любой язык программирования — это набор команд, служащих для общения с нею.
— Правда, многие из нынешних языков программирования уже содержат «в себе» набор заранее составленных алгоритмов, которые разработчик может использовать в качестве готовых. Поэтому язык всё же немного облегчает процесс составления алгоритмов.
— То есть, если один программист составил какой-то алгоритм, то его тут же могут использовать другие?
— Да, и это происходит постоянно. Это одна из причин, почему отрасль IT так быстро развивается. Однако новые алгоритмы приходится составлять самому.
— А составь какой-нибудь прямо сейчас!
— Легко. Классический пример: у вас есть книга, в ней 1000 страниц. Вам нужно открыть в ней, к примеру, 875-ю страницу. Как бы вы стали это делать?
— Ну, просто пробежал от первой до 875-й, только и всего.
— Угу, и придётся тебе глядеть на номер каждой страницы. А представь, если все их уголки слиплись — сколько времени тогда пройдёт? А вот мне достаточно перебрать лишь 3 страницы!
— Как?
— Вначале я выберу страницу, которая находится посередине книги, то есть 500-ю. Потом посмотрю: в какую из образовавшихся половин должна попасть искомая страница?
— Во вторую. А дальше что?
— То же самое. Интервал с 500-й по 1000-ю я снова поделю надвое, открыв центральную страницу. Получится интервал от 750-й страницы до 1000-й, в нём я опять выберу центральную. Какой будет номер?
— 750 плюс 125… Так это же и есть 875!
— Вот видишь. Всего 3 действия! Даже если я буду не совсем точен при выборе центральной страницы, я всё равно найду нужную намного быстрее тебя. Этот алгоритм носит название «дихотомия». Хотя в реальности программисты используют куда более сложные алгоритмы.
— И ты можешь записать его на бумаге?
— Конечно. Где там моя ручка?
— Ну как, алгоритм ясен?
— Хм… Да, и впрямь ясен.
— Сейчас он записан в виде, уже слегка похожем на реальный программный код.
— А в чём отличия?
— В реальном коде все слова будут написаны на английском, а также будет заранее описана структура «книга» (помните, что я раньше рассказывал про структуры данных?). Плюс, для действий «ищем» и «удаляем» тоже будут составлены свои алгоритмы. Но в целом — всё то же самое.
— И ты занимаешься этим изо дня в день?
— В основном.
— И тебе не скучно?
— Ничуть!
Миф №4: программирование — это скучно
Конечно, разработка вполне может наскучить, если заниматься только рутинными и однообразными делами. Например, составлением очень простых алгоритмов, но в большом количестве. Или монотонным поиском ошибок в чужом коде. Но это же касается и любой другой работы — рутина везде убивает творческий процесс. А творчества в программировании немало, написание кода похоже на написание художественной книги. Только, в отличие от большинства писателей, программист сначала сам создаёт свой собственный мир (структуры данных) — а уже потом наполняет его сюжетом (алгоритмами).
Временами это действительно чистое творчество, где разработчик сам устанавливает собственные правила. Несмотря на то, что в мире данных и алгоритмов всё строго и логично, в нём присутствует своя красота. Любой программист может привести десятки примеров очень красивого кода, и ещё больше примеров уродливого. Программисты, как и все люди, тоже ошибаются: если где-то в исходном коде допущена ошибка, то задуманные алгоритмы могут работать неправильно. Поэтому код часто превращается в некий детектив — в котором идёт поиск очередного коварного бага, мешающего исполнению алгоритма, или нарушающего структуру данных…
— В шутку можно сказать, что в итоге получается какой-то детектив в выдуманном мире, выраженный с помощью языка программирования.
— А убийца в этом детективе — дворецкий?
— Ага, нулевой указатель. Бывает так, что весь отдел день-другой ловит особо назойливый баг, и каждый программист из отдела берёт на себя какой-то участок кода. Получается целое расследование, с наказанием виновных и награждением сопричастных…
— Хм, а это и впрямь интересно звучит!
— Вот видишь.
— А, скажем, я могу хоть немного научиться программированию?
— Да, конечно! Я знаю один сайт специально для этого.









