![](https://habrastorage.org/getpro/habr/upload_files/d26/e2f/c95/d26e2fc951a65ed5719c1a1f59787ca0.jpg)
Разработчикам необходимо учиться, учиться и еще раз учиться. Поскольку постоянно появляются новые технологии и обновляются существующие, нельзя один раз освоить программирование и почивать на лаврах: приходится постоянно постигать новые языки и фреймворки.
Однако, одно дело учиться, а другое — действительно понимать, как это происходит. Проведенный в США опрос показал, что большинство расхожих представлений о человеческой памяти противоречит сложившемуся в науке консенсусу: люди не понимают интуитивно, как работают механизмы запоминания информации и обучения37.
В качестве примера рассмотрим концепцию стилей обучения. Защитники этой теории утверждают, будто эффективно подавать материал можно лишь с учетом предпочтений обучающихся. Речь о том, что визуалы смотрят, аудиалы слушают, а кинестетики делают. На эту тему в 2020 году провели исследование, которое показало, что 89% людей считают, что учебный процесс должен определяться предпочитаемым стилем обучающегося. Вот только среди исследователей уже несколько десятилетий господствует совсем другая точка зрения28. Несмотря на существование предпочтений, подача должна в первую очередь соответствовать содержанию материала. Скажем, на уроках естествознания данные следует изображать в виде графиков, а не описывать их словами, будь ученики хоть трижды аудиалами. На курсах кулинарии — использовать практические упражнения вместо чтения, и неважно, кинестетики ученики или нет.
Благо, десятилетия исследований в сферах когнитивной психологии, образования и программирования дали нам глубокие знания о том, как мы учимся. В следующих десяти разделах статьи мы представим научно доказанные факты об обучении, которые касаются и разработчиков ПО, а также поговорим об их практической значимости. Эта информация может помочь в самообразовании, обучении джунов и подборе персонала.
1. Память человека не состоит из битов
Память — ключевой элемент в процессе обучения. Как отмечают исследователи Киршнер и Хендрик, «обучение означает, что в долговременной памяти человека произошли изменения»20. Разработчикам ПО знакома невероятная мощь компьютерной памяти, в которой можно сохранить последовательность битов, а затем извлечь ее в неизменном виде. Хотя в чем-то человеческая память похожа на компьютерную, она не так надежна.
Человеческий мозг слишком сложен, чтобы действовать с точностью машины. При работе с компьютерной памятью мы используем две базовые операции: чтение и запись. Чтение не изменяет содержимое памяти сколько бы времени ни прошло между записью и чтением. Человеческая же долговременная память не так безукоризненна. Похоже, что она работает по принципу «чтение и обновление»: считывание воспоминаний может как укрепить, так и изменить их. Этот процесс еще известен как реконсолидация. Такая модификация более вероятна для недавно сформированных воспоминаний.
Из-за этой особенности факты в нашей памяти не существуют в бинарном состоянии: либо известны, либо нет. На самом деле существуют и промежуточные варианты. Мы можем забывать то, что знали ранее, а некоторые знания оказываются ненадежными, особенно если получены недавно.
Еще одна любопытная особенность человеческой памяти — так называемая распространяющаяся активация (spreading activation)1. Наши воспоминания хранятся во взаимосвязанных цепочках нейронов. Пытаясь что-то вспомнить, мы активируем такую цепочку, нейронный путь, чтобы получить доступ к нужной информации. Только активация не ограничивается одним путем. Часть ее энергии распространяется по другим связанным путям, подобно теплу, от трубы с горячей водой. Эта распространяющаяся активация оставляет связанные с ней пути готовыми к активации в течение нескольких часов1.
Описанный механизм в целом негативно сказывается на памяти1, зато позитивно — на решении задач32. Побочная и далеко не всегда точная информация может смешиваться с основной, что снижает надежность запоминания. В то же время распространение активации помогает решать задачи на основе инсайтов и приносит нам те самые моменты, когда мы восклицаем: «Эврика!».
Так как нейронные пути остаются активированными в течение нескольких часов, иногда переход от одной задачи к другой, которая требует активации новых нейронных путей, приводит к их пересечению и объединению двух ранее несвязанных областей.
Когда они объединяются, могут возникнуть уникальные творческие решения. Вот почему иногда стоит сделать перерыв на прогулку, принятие душа или просто отдохнуть, чтобы выйти из тупика при решении какой-либо проблемы.
Подведем первый промежуточный итог: человеческая память не просто хранит и извлекает данные из определенного места, подобно компьютеру. Она, с одной стороны, более хрупкая и ненадежная, с другой — позволяет глубже понимать и эффективнее решать проблемы, поскольку связывает знания воедино. Более подробно рассмотрим это в следующих разделах. В частности, поговорим об извлечении данных из памяти и об усилении воспоминаний.
2. Память человека состоит из одной ограниченной и одной неограниченной систем
За обучение у человека отвечают два типа памяти — долговременная и рабочая. Долговременная память — это место постоянного хранения информации. Функционально она безгранична1 и работает практически как жесткий диск компьютера. В свою очередь, рабочая память предназначена для осмысления информации с целью решения задач2. Продолжая компьютерные аналогии, она функционирует подобно регистрам CPU, которые хранят ограниченное количество данных в реальном времени, обеспечивая доступ и их обработку.
Рабочая память ограничена, а ее емкость в значительной мере предопределена с рождения2. Хотя ее большой объем, как правило, связан с более развитым общим интеллектом, она не является абсолютным и окончательным показателем производительности22. Да, чем больше рабочая память, тем быстрее учится человек. Но долговременная память снимает ограничения на то, сколько мы способны изучить в целом1. В конечном итоге именно долговременная память делает программиста экспертом.
По мере того как люди узнают больше по какой-либо теме, связанные сведения объединяются в блоки (chunk)a. Они позволяют нескольким частям информации помещаться в рабочей памяти единым целым.
Например, в процессе запоминания адреса электронной почты знакомый домен (допустим, gmail.com) будет рассматриваться как один элемент информации, а не как случайный набор символов наподобие xvjki.wmt. Таким образом, чем больше сведений объединено в блоки, тем обширнее рабочая память в функциональном отношении38 (то есть, чем лучше сгруппирована информация, тем больше ее помещается в рабочую память — прим. переводчика). Если снова воспользоваться компьютерной аналогией, наша рабочая память/регистры процессора позволяет хранить только пять указателей на фрагменты в долгосрочной памяти/на диске. Но размер фрагментов не ограничен, поэтому оптимальная стратегия — увеличивать его за счет использования информации на практике для решения задач.
При изучении новых инструментов либо навыков важно осознавать когнитивную нагрузку или величину емкости рабочей памяти, которая требуется для решения задачи. При этом когнитивная нагрузка состоит из двух частей: неотъемлемой нагрузки и дополнительной.
Первая (intrinsic load) — это количество элементов или блоков информации, необходимых для решения задачи. Ее нельзя снизить, не поменяв саму задачу. Дополнительной же нагрузкой (extraneous cognitive load) называют необязательную информацию, которая, тем не менее, является частью выполнения задачи. Например, дополнительная нагрузка может варьироваться из-за формата представления информации. Допустим, вы описываете базу данных, — проще использовать диаграмму с таблицами и атрибутами, а не текстовое описание. В последнем случае дополнительная нагрузка выше, потому что вы должны мысленно преобразовать описание в схему, тогда как диаграмма проще для восприятия.
В целом начинающие разработчики испытывают более высокую дополнительную нагрузку, потому что им труднее отличить информацию, необходимую для решения задач, от посторонней.
![Два способа описания одной схемы базы данных с различной когнитивной нагрузкой. Поле слева содержит ту же информацию, что и текстовое описание в поле справа. Однако для разработчика, который создает базу данных SQL, более удобным и простым в использовании оказывается не текстовое описание, сопряженное с более высокой когнитивной нагрузкой, а диаграмма. Два способа описания одной схемы базы данных с различной когнитивной нагрузкой. Поле слева содержит ту же информацию, что и текстовое описание в поле справа. Однако для разработчика, который создает базу данных SQL, более удобным и простым в использовании оказывается не текстовое описание, сопряженное с более высокой когнитивной нагрузкой, а диаграмма.](https://habrastorage.org/getpro/habr/upload_files/acf/b0d/6df/acfb0d6dff506e3b0e9ddd751f7b5ec5.jpg)
Столкнувшись с нерешаемой на первый взгляд задачей, важно осознать, что ее можно реорганизовать. Например, декомпозировать на более мелкие подзадачи. Этот принцип следует применять на практике, когда вы натыкаетесь на проблемы, находящиеся на грани или за пределами ваших текущих навыков. Но он особенно актуален при работе с разработчиками-джунами и новыми сотрудниками.
3. Эксперты распознают знакомое, пока новички размышляют
Одно из ключевых различий между начинающими и экспертами заключается в том, что последние уже все видели раньше. Исследования, проведенные среди опытных шахматистов, показали, что их основное преимущество — способность запоминать и распознавать состояние доски. Это позволяет им быстрее и с меньшими усилиями принимать решения о том, как реагировать в той или иной ситуации15. Канеман19,b условно разделяет мыслительный процесс на «систему 1» и «систему 2» (как видите, не только разработчики с трудом подбирают названия). «Система 1» действует быстро и основана на распознавании. Она использует знакомые паттерны в долговременной памяти. А вот «система 2» работает медленнее и базируется на рассуждениях. Она требует больше ресурсов для обработки в рабочей памяти. Это лишь часть общей идеи, которая известна как теория двойного процесса (dual-process theories)34.
Таким образом, опытные разработчики мыслят на более высоком уровне, так как запомнили распространенные в программном коде паттерны (обычно косвенным образом, на опыте). В результате у специалиста высвобождаются ресурсы и облегчается мыслительный процесс4. Одним из таких примеров являются «шаблоны проектирования» в программировании. По своему принципу работы они похожи на описанные выше блоки. Например, эксперт может сразу понять, что конкретный фрагмент кода отвечает за алгоритм сортировки. Новичок же, напротив, будет изучать строку за строкой, пытаясь понять работу кода и не осознавая общей картины.
Словом, джун может стать экспертом прочитав и разобравшись в большом количестве кода. А опытные специалисты уже накапливают ментальную библиотеку паттернов, которая позволяет им легче программировать в будущем. Знакомство с чисто императивным кодом на C лишь частично поможет с пониманием функционального кода на Haskell, поэтому важно знакомиться с разнообразными парадигмами программирования. Именно таким сопоставлением паттернов и объясняется то, что чтение бОльших объемов кода и работа с ними повышает компетентность программиста.
4. Процесс понимания — это переход от абстрактного к конкретному и обратно
Исследования показывают, что опытные специалисты работают с концепциями не так, как новички. Профи используют обобщенные и абстрактные термины, находят базовые понятия и не обращают особого внимания на детали. Начинающие, напротив, часто фокусируются на поверхностных моментах и не всегда могут связать их с общей картиной. Эти различия влияют на ход рассуждений специалистов и то, как они учатся.
Допустим, объясняя переменную функцию в Python новичку, эксперт говорит, что она способна принимать разное количество аргументов. Однако джун с большой вероятностью сосредоточится на деталях (точном синтаксисе объявления и вызова функции) и может решить, что передача одного аргумента — это особый случай. Эксперту же проще понять или предугадать детали, когда ему объясняют концепцию.
При изучении новой концепции полезны оба вида объяснений: абстрактные признаки и конкретные подробности с примерами. Если говорить более конкретно, то вам будет полезно воспользоваться семантической волной (semantic wave). Это концепция, придуманная австралийским ученым Карлом Мэтоном25:
![Семантическая волна для функций с переменным количеством аргументов Семантическая волна для функций с переменным количеством аргументов](https://habrastorage.org/getpro/habr/upload_files/b85/b37/7dc/b85b377dc33384f7a2d7d7e0802b5e91.jpg)
Следуя по семантической волне, вы постоянно переключаетесь между абстрактным определением и несколькими разнообразными примерами этого понятия. Чем более разнообразными они будут, тем лучше. Даже неправильные примеры полезно сравнивать с правильными, чтобы понять, что не так с первыми23. Например, если вы понимаете, что способная изменяться переменная обозначена как константа. Такое изучение называется распаковкой (unpacking).
Изучив разнообразные примеры, можно вернуться к абстрактному определению и выработать более глубокое понимание концепции. Оно возникнет благодаря осознанию того, как множество деталей из примеров связаны с одним абстрактным понятием из определения. Название этого процесса — переупаковка (repacking).
В программировании часто нужно изучать абстрактные понятия. Столкнувшись с абстрактной концепцией, например, с функциями, люди часто тянутся к конкретным ее реализациям. В частности, так делают, чтобы изучить функцию abs
, которая возвращает абсолютное значение числа17. Проблема здесь в том, что по мере того, как концепции становятся все более абстрактными (при переходе от значений к переменным/объектам, функциям/классам, функциям высшего порядка/метаклассам и, в конечном итоге, к теории категорий), расстояние до конкретного примера увеличивается. Но и по мере изучения абстрактных понятий они становятся для нас более конкретными. Изначально функция — абстрактное понятие, которое после длительной практики становится для нас вполне конкретным объектом (или блоком). Тогда мы можем перейти к изучению следующего уровня абстракции.
5. Интервалы и повторения имеют значение
Как часто вы слышали, что не стоит зубрить материал непосредственно перед экзаменами, если не хотите забыть все на следующий день? Этот совет основан на эффекте интервалов (spacing effect)10 — одном из самых прогнозируемых и устойчивых в когнитивной психологии. В соответствии с ним люди лучше всего обучаются концепциям решения задач, если распределяют практику между несколькими занятиями, днями, а в идеале — неделями.
Принцип интервалов работает благодаря описанной выше связи между долговременной и рабочей памятью. Когда учащиеся практикуют решение задач, они отрабатывают сразу два навыка: сопоставляют информацию в задаче с нужной концепцией (например, с циклом) и применяют концепцию на практике (например, пишут этот цикл). Первое требует активации правильного нейронного пути к концепции в долговременной памяти5. Если учащиеся многократно решают однотипные задачи, например, с циклами for-each, то этот путь в долговременной памяти постоянно остается активным, а вышеупомянутый первый навык не отрабатывается. Зачастую в результате непрерывной практики без интервалов люди могут решать задачи лишь тогда, когда им подсказывают нужную концепцию5. Хотя с этой проблемой помогает справиться чередование разных типов задач (скажем, с циклами и условными операторами), нервным путям требуется время для деактивации. Вот почему интервалы необходимыми для получения максимальной пользы от практической деятельности10. Кроме того, мозгу требуется отдых для закрепления информации, чтобы ее можно было применить на деле.
Вопреки этому проверенному временем принципу, интенсивные буткемпы по кодингу требуют от учащихся работать без перерыва в течение нескольких сессий. Да, это не самый лучший подход. Впрочем, даже исследователи эффекта интервалов всегда понимали, что большинство обучающихся и сами стараются пройти всю практическую часть как можно быстрее10. Тем, для кого единственный способ изучения программирования — это интенсивные буткемпы, хочется рекомендовать ознакомиться с выводами из исследования интервалов и применять их на практике.
Для эффективной организации процесса обучения время занятий не должно превышать 90 минут21. Иначе нейрохимический баланс в мозге затрудняет концентрацию21. После каждого занятия следует отводить не менее 20 минут на отдых21. И это вовсе не значит переключиться на другие дела или уткнуться в экран смартфона. Оптимально прогуляться или просто посидеть в тишине и покое. Такая релаксация, как и сон, ускоряет процесс закрепления материала.
В рамках учебного процесса есть несколько стратегий, позволяющих добиться максимальной эффективности. Во-первых, меняйте порядок решения задач таким образом, чтобы в долгосрочной памяти активировались разные концепции5. Однако имейте в виду, что такая рандомизация улучшает результаты обучения, но требует больше усилий6.
Во-вторых — периодически устраивайте короткие паузы, чтобы улучшить консолидацию памяти. Рекомендуется делать 10-секундный перерыв через каждые 2-5 минут18.
6. Интернет не сделал обучение устаревшим
С появлением интернета знания о программировании стали намного доступнее. Любую информацию о синтаксисе или API больше не погребена в справочниках, а находится на расстоянии нескольких нажатий клавиш. Недавно появились инструменты на основе ИИ, такие как ChatGPT, Codex и GitHub Copilot, которые заполняют пробелы в знаниях за вас. В связи с этим возникает очевидный вопрос: зачем запоминать детали, (да и вообще учиться), если за считанные секунды можно получить любые сведения из интернета?
Все дело в том, что в ходе обучения мы сохраняем в долговременной памяти фрагменты знаний и формируем связи между ними1. Это открывает доступ к более высокому уровню понимания и абстракции1. Можно каждый раз искать в интернете и машинально копировать нужный фрагмент кода для выполнения запроса к базе данных. Только вот тогда вы, вряд ли научитесь правильно пользоваться этими запросами. Притом эффективность использования интернета или ИИ различается для новичка и эксперта. Ведь первый не выстраивал когнитивные связи в памяти, изучая нечто новое. В то время как эксперт смотрит на вещи глубже, владеет картиной в целом и ищет лишь забытые мелкие подробности1.
Имеются даже некоторые свидетельства того, что поиск в сети менее эффективен для закрепления информации. Одно из исследований вовсе показало, что материал усваивается хуже, когда информация найдена в интернете, а не в печатной книге11. Есть и другой важный нюанс: если сперва попытаться подумать над вопросом, а не сразу хвататься за смартфон или ноутбук в поисках ответа, это также улучшает запоминание14. Выходит, быстрый доступ к знаниям лишает мозг преимуществ, связанных с укреплением памяти при запоминании информации.
Также существует вышеописанная проблема когнитивной нагрузки. Поиск в интернете требует от мозга частого переключения между контекстами. И без того ограниченное внимание и рабочая память должны переключаться с задач программирования на новые когнитивные операции (поиск в интернете и выбор результата или оценку сгенерированного ИИ контента). Если же необходимые знания как следует запомнить, то доступ к ним станет гораздо более оперативным (как при использовании кэша по сравнению с извлечением информации с жесткого диска). К тому же получится избежать когнитивных потерь, связанных с переключением между контекстами и отсеиванием лишней информации при поиске. Так что есть множество причин запоминать информацию, пусть она и всегда доступна в сети.
7. Решение задач — это не универсальный навык
Большую часть времени в программировании занимает решение каких-либо задач. Одна из распространенных (но ошибочных) идей в разработке ПО состоит в прямом обучении решению задач как универсальному навыку, который можно применить к различным аспектам разработки (проектирование, отладка и так далее). А вот наш мозг не согласен с подобным подходом.
У людей действительно есть некие общие навыки, но они гораздо менее эффективны, чем полученные в конкретной предметной области, например, умение отлаживать программы. Хотя мы можем научиться мыслить логически, нет универсальной методики для решения сразу всех задач. Вместо этого мы учимся выполнять конкретные действия в программировании, планируем лучший ход в шахматах, придумываем узор для вязания — пусть каждый приведет пример себе по душе. Любой из перечисленных навыков обособлен и не влияет на остальные. Исследования шахмат показали, что умение играть никак или практически никак не влияет на другие академические и когнитивные способности. То же самое актуально для обучения музыке и различных когнитивных тренировок36. Раз наш мозг не способен переносить навыки решения с одних на другие задачи, то и различные методики «тренировок мозга» для развития общего интеллекта на деле оказываются бесполезными29.
Единственное исключение — пространственное мышление. Оно позволяет нам визуализировать объекты, например, фигуры из «Тетриса», и всячески манипулировать ими (вращать, отдалять, приближать и т. д.) в своем воображении. Тренировки пространственного мышления могут влиять на обучение в других дисциплинах. Одновременно они повышают показатели по целому ряду невербальных навыков независимо от начальных способностей, возраста или типа тренировочной задачи40. Этот факт так необычен, что вызвал много дискуссий в сфере когнитивных исследований24. Как показали недавние исследования, такие тренировки способны и повысить эффективность профессиональных разработчиков программного обеспечения, вероятно, потому что в процессе работы они продолжают изучать новые концепции30.
Но даже с учетом этого исключения лучший способ решения задач в программировании — это все равно рабочая практика. Не стоит делать ставку на игру в шахматы или другие когнитивные операции, которые, как принято считать, тренируют мозг.
Какой интересный вывод напрашивается из всего этого для рекрутинга? Во время собеседований на позицию программиста стало модно предлагать кандидатам решать задачи-головоломки, например, «как взвесить реактивный самолет». Как выяснила компания Google в 2013 году, это пустая трата времени7. Мир головоломок слабо связан с реальным программированием. Если вы хотите оценить способность писать код, то ее и проверяйте.
8. В некоторых ситуациях опыт может вызывать проблемы
Сегодня очень многое говорится о пользе опыта для обучения и улучшения производительности. Однако иногда он может и доставлять проблемы.
Для повышения эффективности программисты используют разные инструменты и вспомогательные программы, например, системы контроля версий и IDE. Такие тулзы порой по-разному влияют на начинающих и экспертов.
Новичкам может мешать большое количество доступных опций (из-за повышенной когнитивной нагрузки), зато им полезны встроенные подсказки. Экспертов такие шпаргалки скорее отвлекают, чем приносят пользу. Подобная ситуация называется эффектом отрицательного влияния опыта (expertise-reversal effect). Советы и руководства, помогающие новичкам, могут мешать опытным специалистам и делать их менее продуктивными.
Приведем еще один пример. В течение своей карьеры программисты обычно осваивают несколько языков программирования. Разумеется, это очень полезно в работе. Все же иногда перенос знаний с одного языка программирования на другой приводит к ошибкам. Допустим, программист может изучить концепцию наследования в Java, где один метод переопределяет родительский при совпадении сигнатур, и попытаться применить это к C++. А там переопределение родительского метода дополнительно требует, чтобы он был объявлен виртуальным. Подобные несовпадения, когда функции в разных языках похожи по синтаксису, но отличаются по семантике, особенно мешают передаче знаний39.
Хорошо, когда эксперты помогают обучать новичков. Но одной экспертизы бывает недостаточно: без педагогического опыта специалисты часто не осознают, что начинающие думают совсем иначе. А адаптировать свои объяснения под человека с другой моделью мышления — задача не из легких.
Описанный эффект известен как проблема слепого пятна эксперта (expert blind-spot problem). Чтобы от нее избавиться, нужно внимательно слушать, как новички объясняют свое видение проблемы или концепции и подстраивать объяснения соответствующим образом.
Беда в том, что при постоянном применении знания как бы ставятся на автомат, и специалистам становится сложно их вербализировать1. Это именно тот случай, когда эксперт интуитивно понимает, как решить проблему, но все объяснение ограничивается пресловутым «я просто знаю».
Чем консультироваться с таким профи, новичкам лучше использовать учебные материалы, разработанные специально для их уровня. Или же ориентироваться на равных специалистов, которые еще не отточили свои навыки до полного автоматизма. Обладающий бОльшими (но до определенного предела) знаниями коллега — крайне ценный источник информации. Именно он поможет преодолеть разрыв между уровнем новичка и эксперта. Новичкам такое общение с равными упрощает процесс обучения, а специалистам помогает переосмыслить «автоматизированные» навыки.
9. Сложно предсказать наличие способностей к программированию
Успех в изучении программирования, как и в большинстве других видов деятельности, зависит от сочетания врожденных способностей и практики. Некоторые считают, что все зависит от таланта, другие уповают исключительно на практику (концепция «десяти тысяч часов» как раз про это). Обе крайности ошибочны. В этом разделе мы рассмотрим, какое влияние на работу в действительности оказывают природный дар и практика.
К настоящему моменту проведено немало исследований, направленных на предсказание способностей к программированию, но надежных результатов почти нет. Более того, изыскания показали, что на предрасположенность к работе с кодом и созданию ПО не влияет практически ничего.Пол, возраст, научная степень, раса, достижения в математике, опыт работы с другими языками программирования, отношение к computer science или склонность к гуманитарным либо точным наукам — все это неважно35. Попытки создать универсальный тест на программиста обычно заканчиваются неудачей. В 1960-х годах существовала целая индустрия подобных тестирований, но все они вышли из употребления. Робинс33 пришел к выводу, что их точность прогнозирования близка к нулю.
Даже относительно роли многолетнего опыта и практики есть неоднозначные данные. Например, существует корреляция между возрастом и репутацией программистов на Stack Overflow: она зачастую выше у старших специалистов27. Однако недавнее исследование обнаружило лишь слабую связь между стажем и успехом в решении задач программирования среди разработчиков, находящихся на относительно раннем этапе карьеры31. Отсюда может следовать вывод, что способности оказывают более сильный эффект, чем опыт, по крайней мере, на старте деятельности программиста.
Как и в большинстве других предметных областей, общий интеллект и емкость рабочей памяти4 не позволяют выделить людей, которые будут успешны в программировании. Эти факторы приблизительно отражают способности к логическому мышлению и обработке больших объемов информации. Поэтому они скорее предсказывают скорость обучения, а не говорят об абсолютных способностях. Более точный показатель, предсказывающий успех в программировании, — пространственное мышление, но и он довольно умеренно коррелирует с успехом30. Пространственное мышление нельзя назвать уникальным показателем для программирования, поскольку оно предсказывает успех в других областях науки и математики24. Кроме того, эти слабые или умеренные корреляции по большей части исчезают с ростом опыта. В итоге умные люди не всегда становятся хорошими программистами, а хорошие программисты не обязательно должны иметь высокий уровень общего интеллекта.
Короче говоря, очень трудно предсказать, кто будет способен программировать, особенно в долгосрочной перспективе. Разработчиком способен стать человек с самым разнообразным бэкграундом и из любой социальной группы. Связь же с другими факторами (например, с уровнем интеллекта) обычно носит временный характер и исчезает по мере накопления опыта.
Следовательно, при наборе новых программистов не существует ни легких путей оценки перспективности соискателей, ни надежных «профилей кандидатов», которые помогли бы осуществить скрининг на наличие способностей к программированию.
10. Образ мыслей имеет значение
Существует устойчивая идея о бинарном разделении людей по способностям к программированию: вы или можете писать код, или нет. За этим стоит множество конкурирующих теорий. Одна из наиболее убедительных — принцип инерции прогресса обучения (learning edge momentum)33. Основной его смысл в том, что каждая новая тема зависит от предыдущих, поэтому стоит только отстать — и будет трудно наверстать упущенное. Менее убедительная — идея о «гене гика» (geek gene). Человек якобы уже рождается с ним или без него. Впрочем, данная теория почти не имеет эмпирических доказательств26.
Как уже говорилось в предыдущем разделе, мы лишь недавно пришли к пониманию различий в способностях к программированию с фокусом на предыдущий опыт16. Например, похожие выпускники (они из одного класса, имеют одинаковую степень и закончили общие для всех курсы) часто имеют совершенно разные знания и навыки. Это выводит их вперед или назад в плане инерции обучения. На коротком промежутке времени может создаться впечатление, что они «талантливы от природы» или наоборот. Схожий эффект обнаруживается в любой высокотехнологичной области, будь то computer science, физика или проектирование9.
Бинарный взгляд на учащихся и его влияние на преподавание исследовались во множестве научных дисциплин, в работах, где сравнивались fixed и growth mindset.
Притом фиксированный образ мыслей (fixed mindset) применительно к обучению рассматривает способности как врожденные и неизменные величины. Получается, если кто-то испытывает трудности с новой задачей, то она не подходит человеку и он не сможет найти решение.
В противовес такому подходу в развивающемся образе мыслей (growth mindset) способности людей поддаются изменению. В случае возникновения проблем с новой задачей человек при достаточном количестве практики сможет ее решить.
Как пишет Чериан9, обе эти точки зрения неверны. Так, практически каждый может обучиться физике до некоторого уровня, даже если изначально он в ней не силен. Совсем другой разговор — получить Нобелевскую премию по физике, как бы долго ей ни занимался. Мы лишь пытаемся найти границы своих возможностей между двумя этими крайностями.
Впрочем, когда преподаватели и ученики подходят к новым задачам с точки зрения growth mindset, они обычно лучше преодолевают трудности и справляются с неудачами12. Хотя доказательства этого убедительны и интуитивно понятны, исследования показывают, что сделать склад ума более ориентированным на развитие может оказаться непросто8.
В частности, существует два распространенных заблуждения о том, как развить такое мышление. Первое — что нужно поощрять сами усилия, а не результаты. Дескать, тогда отдается предпочтение практике, а не прирожденным умениям. Но учащихся не обманешь: они отлично понимают, действительно ли движутся вперед или же учитель хвалит их для галочки. Усилия должны вознаграждаться только тогда, когда учащийся использует эффективные стратегии и находится на пути к успеху13.
Второе заблуждение — что, однажды попробовав подход growth mindset, человек будет придерживаться этой установки всегда. . В реальности неудачи и поражения нередко склоняют обучающихся к противоположной точке зрения. У них попросту пропадает уверенность в том, где находятся границы их способностей. Выходит, мы должны практиковаться в преодолении неудач, чтобы сохранять мотивацию на рост13.
Применение fixed и growth mindset связано со способом ориентации на цель. Эту ориентацию делят на две категории: стремление и избегание. В первом случае обучающийся хочет делать все правильно. У него складываются эффективные и положительные привычки: упорно трудиться, не стесняться обращаться за помощью, не бояться браться за новые и сложные темы. Если же цель — избегание, то все сводится к страху неудач. Тут уже привычки будут скорее деструктивными: хаотично хвататься за разные темы, избегать просьб о помощи, постоянно тревожиться из-за результатов. Важно, чтобы обучающиеся могли допускать ошибки без серьезных последствий, чтобы они могли избавиться от страхов и выработать в себе «стремление», а не «избегание».
Когда вы осваиваете новый навык или обучаете кого-то, всегда эффективнее подходить к решению задач с настроем на рост и развитие.
К сожалению, не получится просто объяснить это людям на словах. Такой настрой нужно постоянно поддерживать в человеке, предоставляя честную обратную связь о процессе обучения и эффективности выбранных стратегий. Наставникам следует хвалить учеников за успехи и комментировать ошибки без упреков. Обучающимся же, когда они испытывают сомнения в своем прогрессе, впору задуматься о том, как улучшились их навыки за последние недели или месяцы.
Часто, столкнувшись с неудачей, ученик может решить, что без врожденного дара у него ничего не выйдет. Такую тупиковую установку вполне реально изменить, если продолжать усиленно практиковаться. Порой уныние — это нормальная реакция на возникающие трудности. Главное — вовремя взять себя в руки и начать двигаться дальше. Если вдруг возникает желание все бросить, не рубите с плеча. Сделайте перерыв, прогуляйтесь, подумайте о своей стратегии, а затем начните снова.
Подведем итог
Чтобы поспевать за быстрыми изменениями в отрасли, разработчики ПО постоянно должны учиться. Обучение чему угодно, в том числе и программированию, предполагает запоминание — запись данных в память, которая устроена удивительно сложным образом. Хотя у нее есть сходство с архитектурой компьютера, налицо и ключевые отличия. В этой статье мы рассказали о современном научном взгляде на работу памяти человека, процесс обучения, различиях между начинающими и экспертами, а затем связали все это с практическими шагами, которые могут предпринять разработчики ПО для повышения эффективности своего обучения, роста квалификации и успешном устройстве на работу.
Примечание переводчика: В заключение авторы дают несколько кратких, но полезных рекомендаций для рекрутеров в сфере программирования и всех, кто обучается и повышает свою квалификацию.
Рекомендации для рекрутеров:
Не существует хороших косвенных показателей, с помощью которых можно оценить способности кандидатов к программированию. Стереотипы о расе, поле или других факторах не подтверждаются исследованиями. Если вы хотите понять, хорошо ли соискатели программируют, изучите их портфолио или протестируйте на рабочих задачах. Важно — не стоит тестировать кандидатов головоломками.
Годы работы не могут быть надежным мерилом способностей, по крайней мере, для молодых разработчиков.
Рекомендация Бехрузи3: при решения поставленной на собеседовании задачи на соискателя лучше оставить в одиночестве. Присутствие в помещении наблюдателя или человека, требующего каких-либо объяснений, повышает когнитивную нагрузку и стресс, что снижает производительность.
Рекомендации для тех, кто обучается или повышает свою квалификацию:
Чтение и работа с кодом в больших объемах поможет программисту стать эффективнее.
Эксперты не всегда могут хорошо обучать новичков.
Для обучения нужно время, включая перерывы между учебными сессиями. Интенсивная зубрежка неэффективна, в отличие от повторов с интервалами.
Иногда нужно отдохнуть от задачи, чтобы решить ее.
Возможность найти информацию через интернет или при помощи генеративного ИИ не отменяет необходимость в классическом обучении.
Используйте примеры для перехода от абстрактных понятий к конкретным фактам.
Стремление к успеху (а не избегание неудач) и вера в то, что всему можно научиться — вот важные факторы устойчивости и обучаемости.
Что еще почитать. Многие книги про учебный процесс делают упор на его формальные аспекты такая литература предназначена для школьных учителей и университетских лекторов. Однако изложенные там принципы применимы к любому обучению, в том числе и к профессиональному, а также саморазвитию. Мы рекомендуем три книги:
В книге «Почему ученики не любят школу?» Дэниела Уиллингема (Why Don't Students Like School? by Daniel T. Willingham) представлено краткое и понятное описание множества принципов работы памяти и мозга.
В книге «Ум программиста. Как понять и осмыслить любой код» Фелин Херманс (The Programmer's Brain by Felienne Hermansc) эти концепции привязываются к программированию. Вместе с тем описывается, как можно применять в профессиональном развитии техники обучения и повторения, используемые в школе.
В How Learning Happens: Seminal Works in Educational Psychology and What They Mean in Practice Пола Киршнера и Карла Хендрика20 представлен обзор важных научных статей, смысл которых объясняется простым языком. Разбираются основные выводы и связи между ними.
Также в качестве дополнительного чтения можно использовать статьи, на которые мы ссылались выше. Если вы разработчик ПО, то, возможно, у вас нет доступа ко всем статьям. Так, материалы ACM доступны только членам организации с опцией цифровой библиотеки. Хотя многие из наших ссылок взяты из других дисциплин. Авторы более актуальных статей выкладывают бесплатные PDF-файлы на своих веб-сайтах. Вы можете поискать их в интернете по точному названию статьи. Кроме того, многие авторы с радостью предоставят вам копию, если связаться с ними напрямую.
Благодарности
Выражаем признательность Грегу Уилсону, сыгравшему важную роль в создании и вычитке этой статьи, а также другим нашим корректорам: Филипу Брауну, Кристине Диетц, Джеку Паркинсону, Энтони Робинсу и Джастину Турману. Эта работа частично финансировалась National Science Foundation в рамках гранта 1941642. Мнения, открытия, выводы и рекомендации, представленные в материале, принадлежат авторам и необязательно отражают взгляды National Science Foundation.
Источники
1. Anderson, J.R. Cognitive Psychology and its Implications. Macmillan (2005).
2. Baddeley, A. Working memory. Science 255, 5044 (1992), 556–559.
3. Behroozi, M., Shirolkar, S., Barik, T., and Parnin, C. Does stress impact technical interview performance? In Proceedings of the 28th ACM Joint Meeting on European Software Engineering Conf. and Symp. on the Foundations of Software Engineering (2020), 481–492; https://bit.ly/3Sj3AHn
4. Bergersen, G.R. and Gustafsson, J.-E. Programming skill, knowledge, and working memory among professional software developers from an investment theory perspective. J. of Individual Differences 32, 4 (2011), 201.
5. Bjork, R.A. and Allen, T.W. The spacing effect: Consolidation or differential encoding? J. of Verbal Learning and Verbal Behavior 9, 5 (1970), 567–572.
6. Bjork, R.A. and Bjork, E.L. Desirable difficulties in theory and practice. J. of Applied Research in Memory and Cognition 9, 4 (2020), 475.
7. Bryant, A. In head-hunting, big data may not be such a big deal. The New York Times (June 2013); https://nyti.ms/3Msdraa.
8. Burgoyne, A.P., Hambrick, D.Z., and Macnamara, B.N. How firm are the foundations of mind-set theory? The claims appear stronger than the evidence. Psychological Science 31, 3 (2020), 258–267; https://bit.ly/3MsdPp4
9. Cheryan, S., Ziegler, S.A., Montoya, A.K., and Jiang, L. Why are some STEM fields more gender balanced than others? Psychological Bulletin 143, 1 (2017), 1.
10. Dempster, F.N. The spacing effect: A case study in the failure to apply the results of psychological research. American Psychologist 43, 8 (1988), 627.
11. Dong, G. and Potenza, M.N. Behavioural and brain responses related to Internet search and memory. European J. of Neuroscience 42, 8 (2015), 2546–2554; https://bit.ly/49loGL6
12. Dweck, C.S. Mindset: The New Psychology of Success. Random House (2006).
13. Dweck, C.S. and Yeager, D.S. Mindsets: A view from two eras. Perspectives on Psychological Science 14, 3 (2019), 481–496.
14. Giebl, S. et al. Thinking first versus Googling first: Preferences and consequences. J. of Applied Research in Memory and Cognition (2022);https://bit.ly/3QlXun5
15. Gobet, F. and Simon, H.A. The roles of recognition processes and look-ahead search in time-constrained expert problem solving: Evidence from grand-master-level chess. Psychological Science 7, 1 (1996), 52–55;https://bit.ly/40oT4jY
16. Grabarczyk, P., Nicolajsen, S.M., and Brabrand, C. On the effect of onboarding computing students without programming-confidence or experience. In Proceedings of the 22nd Koli Calling Intern. Conf. on Computing Education Research (2022), 1–8.
17. Hazzan, O. Reducing abstraction level when learning abstract algebra concepts. Educational Studies in Mathematics 40, 1 (Sept. 1999), 71–90;https://bit.ly/49lZd4f
18. Huberman, A. Teach & learn better with a "neuroplasticity super protocol". Neural Network (Oct. 2021).
19. Kahneman, D. Thinking, Fast and Slow. Macmillan, 2011.
20. Kirschner, P.A. and Hendrick, C. How Learning Happens: Seminal Works in Educational Psychology and What They Mean in Practice. Routledge (2020).
21. Kleitman, N. Basic rest-activity cycle—22 years later. Sleep 5, 4 (1982), 311–317.
22. Kyllonen, P.C. and Christal, R.E. Reasoning ability is (little more than) working-memory capacity?! Intelligence 14, 4 (1990), 389–433.
23. Margulieux, L. et al. When wrong is right: The instructional power of multiple conceptions. In Proceedings of the 17th ACM Conf. on Intern. Computing Education Research (2021), 184–197.
24. Margulieux, L.E. Spatial encoding strategy theory: The relationship between spatial skill and STEM achievement. In Proceedings of the 2019 ACM Conf. on Intern. Computing Education Research, 81–90; 10.1145/3291279.3339414.
25. Maton, K. Making semantic waves: A key to cumulative knowledge-building. Linguistics and Education 24, 1 (2013), 8–22;https://bit.ly/3tXhvZt.
26. McCartney, R. et al. Folk pedagogy and the geek gene: geekiness quotient. In Proceedings of the 2017 ACM SIGCSE Technical Symp. on Computer Science Education (2017), 405–410.
27. Morrison, P. and Murphy-Hill, E. Is programming knowledge related to age? An exploration of stack overflow. In 2013 10th Working Conf. on Mining Software Repositories (MSR), 69–72;https://bit.ly/3Sp5Mgv.
28. Newton, P.M. and Salvi, A. How common is belief in the learning styles neuromyth, and does it matter? A pragmatic systematic review. Frontiers in Education (2020), 5;https://bit.ly/47h0Jmo.
29. Owen, A.M. et al. Putting brain training to the test. Nature 465, 7299 (2010), 775–778.
30. Parkinson, J. and Cutts, Q. Relationships between an early-stage spatial skills test and final CS degree outcomes. In Proceedings of the 53rd ACM Technical Symp. on Computer Science Education 1, (2022), 293–299; 10.1145/3478431.3499332.
31. Peitek, N. et al. Correlates of programmer efficacy and their link to experience: A combined EEG and eye-tracking study. In Proceedings of the 30th ACM Joint European Software Engineering Conf. and Symp. on the Foundations of Software Engineering (Nov. 2022), 120–131.
32. Raufaste, E., Eyrolle, H., and Mariné, C. Pertinence generation in radiological diagnosis: Spreading activation and the nature of expertise. Cognitive Science 22, 4 (1998), 517–546;https://bit.ly/3sidUoq
33. Robins, A. Learning edge momentum: A new account of outcomes in CS1. Computer Science Education 20, 1 (2010), 37–71.
34. Robins, A.V. Dual process theories: Computing cognition in context. ACM Trans. Comput. Education 22, 4 (Sept. 2022); 10.1145/3487055.
35. Rountree, N., Rountree, J., Robins, A., and Hannah, R. Interacting factors that predict success and failure in a CS1 course. ACM SIGCSE Bulletin 36, 4 (2004), 101–104.
36. Sala, G. and Gobet, F. Does far transfer exist? Negative evidence from chess, music, and working memory training. Current Directions in Psychological Science 26, 6 (2017), 515–520; 10.1177/0963721417712760.
37. Simons, D.J. and Chabris, C.F. What people believe about how memory works: A representative survey of the U.S. population. PLOS ONE 6, 8 (Aug. 2011), 1–7;10.1371/journal.pone.0022757.
38. Thalmann, M., Souza, A.S., and Oberauer, K. How does chunking help working memory? J. of Experimental Psychology: Learning, Memory, and Cognition 45, 1 (2019), 37
39. Tshukudu, E. and Cutts, Q. Understanding conceptual transfer for students learning new programming languages. In Proceedings of the 2020 ACM Conf. on Intern. Computing Education Research, 227–237; 10.1145/3372782.3406270.
40. Uttal, D.H. et al. The malleability of spatial skills: A meta-analysis of training studies. Psychological Bulletin 139, 2 (2013), 352.
Авторы
Нил Браун (Neil C.C. Brown) — старший научный сотрудник Королевского колледжа Лондона, Великобритания
Фелин Херманс (Felienne F.J. Hermans) — профессор Амстердамского свободного университета, Нидерланды.
Лорен Маржиле (Lauren E. Margulieux) (lmargulieux@gsu.edu) — доцент Learning Sciences Университета штата Джорджия, США.
Примечания
a. Это не какое-то неофициальное определение: в науке они действительно называются блоками (chunk).
b. Частично информация из книг Канемана была поставлена под сомнение кризисом воспроизводимости научных исследований, повлиявшим на часть его открытий, но не на идею систем 1 и 2.
c. Скажем честно: эта книга написана одним из авторов статьи, но другие авторы тоже ее рекомендуют.
Дополнительные источники онлайн: полный список ссылок и вспомогательной информации доступен по адресу https://bit.ly/3G2NPNl.