Это правда, что мышление программистов устроено иначе, чем у других людей. Не сказать, что они обязательно умнее, логичнее или рациональнее остальных. Однако не так давно учёные приступили к изучению влияния программирования на мозг, и пришли к интересным заключениям.
Как занятия искусствами могут по-разному менять ваше мышление, так и программирование влияет на ваш образ мыслей — возможно, не так, как вы ожидали.
1. Программирование влияет на ваши когнитивные модели
Важно ли, с какого языка программирования вы начали свой путь в этой профессии? Да!
Звучит нечестно, правда? Как ни крути, а большинство из нас познакомились с программированием ещё в школе, и первый язык нам навязывали. Я начал с языка С. Те, кто постарше меня, начинали с FORTRAN, COBOL или BASIC. А те, кто младше? Вы наверняка начинали с Java или Python.
Вне всяких сомнений, структура языка программирования влияет на образ мышления. Эдсгер Дейкстра, один из влиятельнейших учёных в сфере информатики, знал об этом, когда сказал:
Инструменты, которые мы используем, оказывают глубокое (и подспудное) влияние на наши мыслительные привычки, и, следовательно, на наши мыслительные способности.
Затем он сказал:
COBOL уродует разум; его преподавание нужно расценивать как уголовное преступление.
И ещё:
Практически невозможно научить хорошо программировать студентов, которые раньше изучали BASIC: как потенциальные программисты они умственно искалечены, без надежды на восстановление.
Ой.
В каком-то смысле, все языки программирования равны, потому что они полны по Тьюрингу. С другой стороны, овладение одним языком может привести к проблемам в другом. Программисты на Java и на Python — два разных типа специалистов, которые совершенно по-разному подходят к программированию.
Иными словами, парадигмы и идиомы вашего первого языка программирования влияют, и даже диктуют ваши ментальные подходы к структурам данных, алгоритмам и так далее.
Более того, можно взять анонимизированный код и определить, кто его написал, опираясь только на выбранный подход к решению задачи и стиль написания кода. И чем сложнее задача, тем легче «деанонимизировать» код.
Обратите внимание на это исследование стилеметрии кода и расшифровку лекции, посвящённой той же проблематике:
Программисты могут обфусцировать переменные или имена функций, но не структуры, которые они подсознательно предпочитают использовать, или любимые операторы инкрементирования.
В английском языке есть пословица, которая суммирует всё вышесказанное в одной понятной фразе: «Когда у тебя есть только молоток, всё похоже на гвоздь». То есть научившись программировать определённым образом, вы будете аналогично подходить к решению всех задач.
Так что выбирайте язык программирования с умом!
2. Программирование помогает укрепить здоровье мозга
Мозг часто сравнивают с мышцей, которую нужно постоянно тренировать, чтобы оставаться умным и сообразительным. Так ли это? И если да, то можно ли считать программирование ментальным упражнением, достаточным для укрепления здоровья мозга?
Авторы метаисследования 1991 года хотели выяснить «влияние компьютерного программирования на когнитивные результаты», и обнаружили, что студенты, имевшие опыт программирования, при тестировании когнитивных способностей набирают на 16 перцентильных баллов больше, чем студенты без опыта программирования.
В ходе более крупного исследования 1999 года подтвердилось, что «интеллектуальная деятельность препятствует снижению [когнитивных] способностей». Но также авторы отметили, что, возможно, снижение когнитивных способностей может привести уменьшению вовлечённости в интеллектуальную деятельность.
Авторы ещё более крупного исследования 2009 года пришли к тому же выводу, и предположили, что «люди, участвующие в деятельности, стимулирующей мозг, в последующие годы могут снизить вероятность [и даже оттянуть начало] болезни Альцгеймера и прочих видов слабоумия». К стимулирующей мозг деятельности отнесли чтение, письмо, головоломки, настольные и карточные игры, исполнение музыки.
Наконец, в исследовании, опубликованном в 2013-м, сказано, что лишь строго определённые виды мыслительной деятельность действительно улучшают наш мозг, а именно — интенсивная когнитивная деятельность, интеллектуально трудная и подразумевающая изучение чего-либо.
Конечно, эта тема требует большего количества исследований, но всё же трудно представить себе такую умственную деятельность, которая требует больше сил и больше сосредоточена на изучении, чем программирование.
Хотя все упомянутые исследования и не доказывают, что интеллектуальная деятельность делает нас умнее или способнее, однако результаты говорят о том, что трудные когнитивные задачи как минимум улучшают текущее состояние мозга и значительно снижают вероятность деградации.
Бытует точка зрения, что учиться программированию никогда не поздно, и описанные исследования лишь подтверждают это мнение. Программирование идёт на пользу!
3. Программирование — это не одни лишь математика с логикой
В исследовании 2014 года с помощью функционального МРТ изучалась активность мозга программистов, которые старались понять и проработать фрагменты кода. Выяснилось, что при изучении исходного кода задействованы пять областей мозга:
- BA 6: средняя лобная извилина (внимание, язык, рабочая память)
- BA 21: средняя височная извилина (семантический поиск в памяти)
- BA 40: нижняя теменная доля (рабочая память)
- BA 44: нижняя лобная извилина (рабочая память)
- BA 47: нижняя лобная извилина (язык, рабочая память)
То есть при работе с исходным кодом в основном задействованы те части мозга, которые обычно связаны с обработкой языка, памятью и вниманием.
Обратите внимание, что при этом почти не задействованы разделы мозга, связанные с математикой и вычислениями — даже при анализе фрагментов с циклами, условными и арифметическими вычислениями, и прочими алгоритмическими операциями.
Конечно, исследование не было всеобъемлющим, и его авторы указывают:
- В эксперименте использовались фрагменты кода меньше чем на 20 строк, а время работы с ними ограничивалось, то есть этот код не был особенно трудным для испытуемых.
- Результаты исследования свидетельствуют не о том, что языки программирования сродни иностранным языкам, а лишь о задействовании тех же разделов мозга.
- Испытуемые не писали код, а при этом могут быть задействованы другие области мозга, чем при анализе уже имеющегося кода.
Но вот что нужно отметить. Мы знаем, что программисты регулярно анализируют исходный код, написанный ими самими или кем-то другим. Мы также знаем, что программисты часто тратят больше времени на исправление и рефакторинг имеющегося кода, чем на написание нового с нуля.
Так что это исследование вовсе не бессмысленно. Программирование — не просто «деятельность левого полушария мозга», и можно даже предположить, что у «правополушарных» программистов есть определённое преимущество.
Комментарии (53)
muhaa
09.04.2018 14:24+3Практически невозможно научить хорошо программировать студентов, которые раньше изучали BASIC: как потенциальные программисты они умственно искалечены, без надежды на восстановление.
Вообще чушь. Мыслящие люди начав писать на Бейсике сразу чувствовали чего им там не хватает. Потом увидев это в C++ или Pascal мгновенно и радостно меняли язык. Если студент не относится к мыслящим людям, то из него полюбому нормального программиста не выйдет, с чего он ни начни.dipsy
09.04.2018 15:19Пришлось лично наблюдать довольно страшные вещи. Лет 15 тому назад в небольшом коллективе системщиков, переходящих с си на с++, у большей части мышление и через 3 года оставалось в привычных рамках активных манипуляций с указателями на указатели и прочих удивительных вещей (представьте что-нибудь на свой вкус, а то долго расписывать придется). Не менее фантастические вещи наблюдались и с многими людьми, переходящими с привычного C# на С++, самое невинное это постоянное foo* bar= new foo() без последующего delete.
Возможно это конкретно мне так не повезло, в других местах все мгновенно адаптируются и всё такое, как вы написали, я таких практически не встречал.fatronix
09.04.2018 17:34Тут, я думаю, дело конкретно в бэйсике. У меня тоже такие были мысли «ого, как я без этого раньше жил» после перехода на паскаль. Ну либо дело в возрасте, когда в среднем бэйсик изучали — подростковый/юношеский, когда мозг гибче.
0x131315
09.04.2018 19:22Конкретно при переходе с языка низкого уровня на язык высокого, иногда пользуешься низкоуровневым подходом, потому что представляешь, как оно устроено, и понимаешь, что это эквивалентно, но проще. Особенно касается указателей, циклов, и условий — иногда проще напрямую обращаться к памяти, чем пользоваться интерфейсами яву.
Да, это опасно, да, это может перестать работать на другом железа/версии языка. Но многим достаточно, что работает здесь и сейчас
mkm565
09.04.2018 22:15в привычных рамках активных манипуляций с указателями на указатели и прочих удивительных вещей (представьте что-нибудь на свой вкус, а то долго расписывать придется)
«Вы так говорите, как будто это что-то плохое» (с)
А как же дебаты отом сколько поместится ангелов на конце иглыэквивалентности **argv и *argv[]?
Я еще помню конструкцию
IF(I) 10,20,30
И ничего, жили как-то. А сейчас кажется хтоническим полярным зверем, кода это вижу.
Sadler
10.04.2018 12:59постоянное foo* bar= new foo() без последующего delete.
Это тот случай, когда безопаснее использовать region-based memory management и быть уверенным, что весь выделенный пул будет в заранее заданный момент гарантированно уничтожен, если даже один из программистов не очистил память за собой.dipsy
10.04.2018 14:40Ну само собой, new с последующим delete это или наследие си с его malloc/free, или, если без delete, то C#. На плюсах делать вручную «new/delete» и прочие «open/не забыть close» не надо, как ни очевидно, но до многих и через месяцы и годы практики не доходит.
Makc_K
10.04.2018 13:48Пффф, я вас умоляю, для многих (судя по форумам) «программистов» c# открытие, что есть объекты, которым надо вручную освобождать ресурсы вызывая метод Dispose() или оборачивая в директиву using. И очень удивляются, когда программа разжирается до 2гб в памяти и падает в Out of memory.
Aigir
09.04.2018 14:26т.к. разные языки программирования используют разные области мозга, то наверное можно можно сформулировать некую базовую программистскую диету (набор рекомендуемых и нежелательных языков программирования) для многостороннего гармоничного развития программистского мозга, например:
— запрещенные: Cobol, Fortran,…
— не рекомендуемые: Basic,…Makc_K
09.04.2018 14:40Программистская диета — это сильно…
Доктор запретил C#, т.к. наблюдаются явные признаки ожирения кода. Весь день держу себя в руках, время от времени позволяя себе чуть-чуть кода на Delphi, но вчера после очередной бессонной ночи не выдержал, сорвался… очнулся только к обеду за клавиатурой и с запущенной Visual Studio.
guai
09.04.2018 14:30«В каком-то смысле, все языки программирования равны, потому что они полны по Тьюрингу.»
"… молоток..."
бинго! 2 наименее осмысленных утверждения, которые можно встретить в спорах о языках программированияRomanArzumanyan
09.04.2018 15:20Гвозди (пусть будет С), шурупы (С++), клей (Java), заклёпки (Go), двусторонний скотч (ну это Perl без вариантов) эквивалентны с той точки зрения, что являются крепежом.
Если у вас в руках молоток (суровое прошлое), то всё вокруг кажется гвоздями (пиши на С или умри).tretyakovpe
10.04.2018 08:50По-вашему, джависты никогда в жизни не смогут в С?
RomanArzumanyan
10.04.2018 08:53Смогут. Есть такой клей, называется "жидкие гвозди". А вот Сишники, если хотят в С++, частенько забивают шурупы молотком!
Шутка, конечно.
eandr_67
09.04.2018 14:52Автор (или переводчик?) элементарно путает «математику» и «арифметику». Интересно, кто-то изучал, какие области мозга задействованы при работе, например, с теорией категорий или топологией? Насколько вообще в современной высшей математике задействованы области мозга, отвечающие за арифметические вычисления?
И если провести такие исследования, то велика вероятность, что с точки зрения задействованных отделов мозга, программирование (именно процесс программирования, а не запись полученного ответа на каком-то языке программирования) ничем не будет отличаться от других разделов высшей математики.tretyakovpe
10.04.2018 08:51Автор считает, будто учётным казалось, что программисты прогоняют тестовые примеры в процессе анализа кода.
multiprogramm
09.04.2018 15:33Эдсгер Дейкстра, один из влиятельнейших учёных в сфере информатики, знал об этом, когда сказал
Ну или он просто высказал своё субъективное мнение, которое подхватили, потому что он
один из влиятельнейших учёных в сфере информатики
Error1024
09.04.2018 16:13COBOL уродует разум; его преподавание нужно расценивать как уголовное преступление.
Практически невозможно научить хорошо программировать студентов, которые раньше изучали BASIC: как потенциальные программисты они умственно искалечены, без надежды на восстановление.
Ооо, да, набор самых дебильных цитат из мира it :)
FlamyXD
09.04.2018 17:12Практически невозможно научить хорошо программировать студентов, которые раньше изучали BASIC: как потенциальные программисты они умственно искалечены, без надежды на восстановление.
*вставить шутку про 1С*
Closius
09.04.2018 18:59Давно это понимал. Программирование это фактически описание жизни. Программист в пределе может описать всю вселенную, включая поведение людей и тд. И я бы еще добавил что для программиста хорошо быть буддистом или индуистом ну или атеистом. Почему? Почитайте сами.
old_bear
09.04.2018 20:12Интересно, что скажут знатоки про дальнейшую судьбу того, у кого первым активно используемым языком был verilog?
vdonich
09.04.2018 20:58Куча ругани и никакого конструктива. Так, собственно, хоть какой-то кандидат есть хороший для первого языка?
Я уж не говорю про то, что язык, по сути, не принципиален, только парадигма. Писать функциональщину, ООП или процедурный — хоть одновременно — можно на куче разных в наше-то время.Skerrigan
10.04.2018 09:29Мне легче всего было начать с JS — очень щадящие условия были в то время. Но это было до бабелей и прочего зверья.
А вот взросление уже пошло на Java. Тут уже и архитектура, и паттерны, и бронировка кода.
*Ну а так, конечно, даже в JS можно вспомнить «лучше пойду в проститутки».jpg
Borjomy
10.04.2018 11:29Я предлагаю LabView. Мощно развивает визуальное мышление. Только действие, никаких отвлечений на поиски названий переменных и пр., функция в виде графического объекта, а не текста, базовое распараллеливание задач. И прочее.
Deorte
10.04.2018 04:49Однако не так давно учёные приступили к изучению влияния программирования на мозг, и...
Я так понимаю, что это были британские учёные? :)
Debianer70
10.04.2018 11:29А я начинал с Pascal, да и сейчас с удовольствием на Delphi пишу. ООП, язык структурированно-логичный и понятный, низкоуровневые вещи тоже вполне…
Мне нравится. А Бейсик — это, ИМХО, чудо(вище) какое-то, именно для ломки мозгаMakc_K
10.04.2018 11:35Во времена моего детства/отрочества у меня был Спектрум с ОС TR-DOS, соответственно в шаговой доступности Basic и пара книг по нему (совсем детских, почти в стиле комиксов). На тот момент, по крайней мере в моём окружении, ничего лучше для знакомства с миром разработки ПО не было.
ainoneko
10.04.2018 16:37Когда у меня появился Спектрум (без дисковода), я уже программировал на калькуляторе МК-61 (и на МК-51, который не был программируемым — для него программы писал на бумажке, чтобы не думать при вычислениях) — а там уже были C, Forth, Pascal, LOGO, Beta-Basic (в котором были нормальные процедуры и функции), правда, надо было их грузить с кассеты каждый раз, но никто не говорил, что будет легко.
Ну и парой ассебмлеров пользовался: ZEUS (в котором был ответ «42») и GENS/MONS — после калькулятора это не так сложно.
trantor1
10.04.2018 11:29Начинал с ASM Z80, вот сижу и думаю, плохо или хорошо. :-)
saboteur_kiev
10.04.2018 15:34Вы смогли начать с ASM Z80, перепрыгнув Basic Z80?
А как вы ASM загружали?
P.S. Даже любопытно, как вы отмажетесь =)
DonArmaturo
10.04.2018 11:56А отрицательно влияет, судя по Дейкстре. Снобизм на пустом месте. Замечали крутость «теплых ламповых» софтинок из 80-х? Их писали люди с мышлением, сформированным реальной жизнью, а не изуродованным «объектно-ориентированной парадигмой».
Математика — наука о численных и пространственных отношениях реального мира. Программирование — средство реализации управляющих и расчетных алгоритмов. Основанных на реальной физике, математике и МСФО.Idot
10.04.2018 22:27А отрицательно влияет, судя по Дейкстре. Снобизм на пустом месте. Замечали крутость «теплых ламповых» софтинок из 80-х? Их писали люди с мышлением, сформированным реальной жизнью, а не изуродованным «объектно-ориентированной парадигмой».
Дейкстра — вообще не сторонник ООП, а сторонник «дисциплины программирования», и он ненавидел Basic за активное использование в нём GoTo.
Классический Basic позволял редактировать код в живую и весьма своеобразным способом
10 что-нибудь 20 что-нибудь
редактировалось вставкой
10 что-нибудь 15 что-нибудь добавили 20 что-нибудь
что позволяло сесть писать программу с ходу, но если недостаточно всё заранее продумали, то код превращался в лапшу с обилием GoTo.
10 что-нибудь 15 что-нибудь 16 GOTO 70 20 что-нибудь ... 49 REM следующая строка конец программы 50 RETURN ... 70 что-нибудь добавили 75 что-нибудь добавили 80 что-нибудь добавили 85 что-нибудь добавили 90 GOTO 20
Дейкстра же требовал в рамках «дисциплины программирования» сначала вылизать алгоритм на бумажке, так чтобы в нём не было GoTo, и только затем сесть писать программу.saboteur_kiev
11.04.2018 14:15Следствие того, что в первых бейсиках все строки были пронумерованы, и имен у подпрограмм не было, использование goto было вполне нормальным.
goto 100
call 100
Если убрать нумерацию строк, то необходимо сразу ввести блоки. А в бейсике их просто не было. Поэтому не было никакого смысла менять goto на что-то, если структура оставалась неизменной.
martin__marlen
10.04.2018 12:24Дейкстра не про VB писал. А изначальный Васик был реально гнусен.
А на счет Си, действительно, те, кто долго и эффективно писал на Си, испытывают трудности даже с С++, не говоря уже о C# и Жабе. А вот с ЛИСПом у них никаких проблем. Но потом становится пофиг.
Мне, наверное повезло, потому что изучив работу с компом и программирование в восьмеричных кодах, я сразу приступил к изучению Ada. Никаких стереотипов не осталось. А насчет Скриптовых, то до сих пор жалею. что в браузерах поселился JS, а не более подходящий для этого Rexx.
Caelwyn
10.04.2018 12:50Тут скорее разница не между бейсиком, си и плюсам, а самим подходом в написанию — разница между процедурным языком и ООП. Сам начинал с бейсика, потом писал на паскале и на си под микроконтроллеры, это развивает определённый стиль мышления, построения алгоритмов — процедурный, и переходить с него на ООП поначалу довольно сложно бывает.
saboteur_kiev
10.04.2018 15:33Мы также знаем, что программисты часто тратят больше времени на исправление и рефакторинг имеющегося кода, чем на написание нового с нуля.
А такая теория — на мозг влияет не само программирование, а отладка и рефакторинг, которые занимают бОльшую часть времени.
Ведь именно отладка заставляет программиста критично относится к коду, и рассчитывать не на изначальную конструкцию, а именно на тесты/отладку, чтобы получить в конце концов результат?
juray
11.04.2018 23:58А как с теми, кто начинал с подобного вот:
Да еще контролировал правильность набора команд по 16-ричным кодам в забавном отображении на 7 сегментах (А=-, B=L, C=C, D=Г, F=пусто).
Да и не то что программировать — просто считать на этом аппарате надо было, вывернув мозг: стек, обратная польская запись.
Потом был Школьный Алгоритмический язык, потом таки Бейсик (в разных вариантах — на Специалисте один, на БК-0011 другой, на PC XT третий).
В ВУЗе же, чтоб жизнь медом не казалась — для начала побитное забивание микропрограммы в набор микропроцессорных секций, а также проектирование микропрограммных автоматов (то есть по сути — табличных конечных автоматов) на ПЗУ и регистре-защёлке.
После этого машинные коды 8080 (точнее, 580ИК80), набиваемые с клавиатуры, казались раем (не, не ассемблер, именно 16-ричные коды).
Потом были Турбо Паскаль и ФоксПро.
Потом устройство на работу, где на отдел в 15-20 программистов — пяток компов. Пиши на бумаге. И для начала — не прогу, а R-граф (это типа блок-схемы, только с нотацией, пригодной для печати ASCII-графикой на АЦПУ типа «печатная машинка», с фиксированным шрифтом). И в результате приобретение убеждения, что софт должен проектироваться, как любая инженерная конструкция — а на каком языке в итоге кодировать, вопрос второй.
Неудивительно, что через много лет позже я стал фанатом SWITCH-технологии и ООП с явным выделением состояний.
На очереди — изучение языка релейной логики Ladder Diagram; не думаю, что будут сложности.
Reawer
Программистом быть — хорошо, но это еще не точно…
Skerrigan
Завязка на тренажерку подтверждает (что все далеко не так радужно) — категорически стало невозможно жить без физ-нагрузки на тело. Иначе жопа/спина/ноги «сходят с ума».