Несколько уроков, извлеченных из обучения программированию людей, которые только начали.

Обучение программированию - одно из самых полезных занятий. Психология и технологии - две вещи, которые мне очень дороги. Как психолог, я получаю удовольствие от того, что помогаю людям учиться и совершенствовать собственное мышление. Это в контексте технологий означает расширение прав и возможностей, я могу помочь другим понять, что они могут создать.

Эта статья посвящена обучению коду взрослых учеников, которые только начали. Если вы никогда не пробовали, изучать разработку программного обеспечения чертовски сложно. Меня всегда поражали люди, которые посещают учебные курсы, подобные нашему, или участвуют в чрезвычайно сложных программах самообучения.

Выбор нового синтаксиса для выражения своих мыслей может быть меньшей проблемой. Лично я считаю, что одним из самых больших препятствий для новичков является сложность контролировать очень много разных контекстов. До кодирования ваш компьютер представляет собой совершенно предсказуемый черный ящик. Спустя два дня разработки программного обеспечения сложность кажется бесконечной.

Когда вы создаете свой первый проект, появляются новые контексты, правила и отношения. Языки, базы данных и фреймворки создают сеть, которая непредсказуемо распространяется на ваш компьютер и Интернет. Вначале сложно уловить закономерности, а понимание простейших действий требует большей части ваших умственных ресурсов.

Изучение программирования также станет испытанием вашего терпения. Вам нужно справиться с постоянным трением между идеей, которую вы хотите выразить, и тем, что на самом деле поймет неумолимый компьютер. Тысячи ошибок появляются в малоизвестных журналах терминала, а поиск в StackOverflow только ведет вас глубже в кроличью нору. Никто не будет винить вас, если вы подумаете о поджоге своего компьютера.

В конце процесса ждет удивительная награда. Изучение того, как использовать код для воплощения своих идей в жизнь, - это поистине вдохновляющее чувство.

Итак, если научиться программировать с нуля - это сложно, то помощь другим людям рассуждать и учиться во время процесса программирования, получая при этом удовольствие от процесса, неизбежно требует некоторой тонкости. Быть хорошим программистом еще не значит. Вы должны уметь сохранять мышление новичка, уметь читать и мотивировать людей, а также превращать сухие абстракции информатики в интересные истории. Вам нужно мягко направлять мысли других и развивать хорошие навыки программирования. Это ужасно много.

В этой статье я собрал несколько принципов и советов, основанных на когнитивных науках, изучении психологии и моем собственном опыте (также известном как ошибки). Большинство указателей связаны с тремя контекстами, в которых я обычно нахожусь: чтение лекций, живое программирование и помощь студентам.

Поощряйте совместное программирование

Преимущества обучения в совместной среде хорошо изучены. Совместная работа означает более высокую активацию мозга. В такой деятельности, которая требует высокой пропускной способности и близкой к семантике, как кодирование, я думаю, что сотрудничество имеет решающее значение, когда вы только начинаете.

Кодирование с другими людьми заставляет учащихся выражать свои мыслительные процессы словами. Это подталкивает их к раскрытию своих предположений о том, как работает код. Сотрудничество с более опытными разработчиками помогает им увидеть, как другие могут решить проблему по-другому. Поощрение студентов к быстрому изучению парного программирования в значительной степени способствует улучшению результатов обучения.

Групповые живые коды также могут быть очень эффективными, если они ограничены по времени и основываются на концепциях, с которыми учащиеся уже знакомы. Проведение партнерских обзоров кода и сеансов рефакторинга также способствует отличному обсуждению концепций более высокого уровня, таких как качество кода, варианты выбора и компромиссы.

Развивайте основы с повторением и активным вспоминанием

Любая новая задача, которая негативно сказывается на вашей исполнительной функции, потребует большей части вашего внимания. После достаточного количества повторений все начинает "щелкать", и вы можете делать это почти без усилий (например, вспомните свой первый день за рулем или свой первый день игры на музыкальном инструменте).

Это один из основных вкладов Даниэля Канемана и Амоса Тверски в когнитивную психологию. Постоянной проблемой на пути изучения сложных навыков является разбиение новых задач на части и перемещение их из системы 1 (ограниченной, осознанной, вербальной) в систему 2 (автоматизированную, полубессознательную, невербальную).

Кодирование ничем не отличается. Вы хотите, чтобы ваши ученики как можно скорее автоматизировали основные процедуры, чтобы они могли сосредоточить свое внимание на более сложных вопросах. Такие ресурсы, как флэш-карты, целенаправленные упражнения по кодированию и быстрые викторины, очень ценны для понимания основ.

Продвигайте установку на рост

Термин «установка на рост» был придуман Кэрол Двек. Он стал частью компендиума по поп-психологии и оказался очень успешным в корпоративном мире. Основная идея сводится к следующему: 1) Люди, которые лучше учатся, склонны рассматривать неудачи как возможности и уделять больше внимания процессу обучения, чем результату. 2) Это не стабильная конструкция личности, любой может развить установку на рост - как тренер вы можете моделировать ее и помогать другим развивать ее.

Это особенно актуально в контексте учебного лагеря. Студенты, желающие получить работу на рынке технологий, потратили много времени и денег, поэтому результаты имеют значение. Соревновательная динамика может быстро возникнуть в когорте, и негативный разговор с самим собой часто происходит у студентов, которые не соответствуют их собственным ожиданиям или чувствуют, что они отстают. Они перестают сосредотачиваться на обучении и обращают внимание только на свое определение успеха. Ваша работа в качестве тренера по разработке выходит за рамки передачи знаний. Вы должны способствовать развитию мышления и самоэффективности.

Пример:

- student: Oh dear, I will never understand closures.
- terrible_coach: Ah, this is nothing. Wait until you see recursion.
- another_terrible_coach: It's ok. Keep applying yourself and you will get better.
- better_coach: You have not gotten them *yet*, but you will for sure. Closures are hard and they take a bit to sink in. I remember having difficulties with them too. Let's go through an example together.

Несколько советов: поощряйте позитивный разговор с самим собой. Стимулируйте учащихся нарушать свои программы и понимать, почему что-то перестало работать. Поздравьте учащихся, когда они пытаются понять, как что-то работает, помимо того, что ожидает тест. Объявляйте ошибки как то, чему можно радоваться (если вы получаете разные ошибки). Поощряйте студентов получать удовольствие от программирования и верить в них. Покажите уязвимость и признайте взлеты и падения на собственном пути в разработке программного обеспечения.

Чтобы поддерживать мотивацию учащихся, нужно понимать, что ими движет

Если вы не привыкли к формальным языкам, программирование в вакууме может оказаться довольно сухим. Среднестатистического ученика больше всего заботит то, что делает возможной разработка программного обеспечения, а не , что такое разработка программного обеспечения. Обучение программированию - это интеллектуальный путь, но большинство людей, которые ищут его в более позднем возрасте, рассматривают программирование как средство достижения цели. конец.

Если вы будете внимательны, вы быстро заметите, что движет вашими учениками. Некоторые мечтают открыть собственное предприятие. Другие хотят кочевой жизни. В мире технологий есть люди, компании, сообщества и иконы, которыми они уже восхищаются. Хитрый тренер внимательно относится к этим подсказкам и использует их, чтобы украсить технические объяснения правильными примерами и историями.

У вас есть куча технических предпринимателей, и вы преподаете Ruby on Rails - вы можете добиться гораздо большего, если упомянете, чего с его помощью достигли некоторые компании, такие как Twitter и Shopify. Если вы запускаете живой код для решения упражнения типа Fizz-Buzz для студентов, которые хотят быть разработчиками программного обеспечения, они с большей вероятностью будут вовлечены, если вы упомянете, что ката было (к сожалению) популярным на технических собеседованиях. Дело в том, чтобы создавать повествования, которые привязывают контент к интересному для них фрейму.

Сначала нажмите "Аналогии", а затем "Предыдущие знания".

Выразительность языков программирования - это часть того, что делает программное обеспечение таким мощным и волшебным - мы можем составлять абстракции друг над другом с помощью слов, как только мы понимаем движущиеся части языка.

Однако большая часть терминологии, необходимой для начала «мышления в коде», непонятна для непосвященных: «Что значит выдавать блок? Что такое обещание? Что такое инкапсуляция? ». Когда мы не можем связать новую абстракцию с чем-то, что мы уже знали, или когда не хватает контекста, чтобы предположить, о чем может быть идея, процесс понимания останавливается.

Связывание абстрактных понятий с соответствующими объектами в физическом мире может иметь решающее значение. Дети начинают считать пальцами, чтобы компенсировать тот факт, что их абстрактные рассуждения еще не завершены. Взрослые в коренных племенах изо всех сил пытаются научиться считать «мысленно», но с большей вероятностью выучат счет, если учитель использует предметы повседневного обихода, такие как мачете или стрелы. Построение правильных представлений и аналогий имеет большое значение.

Если вы думаете, что эти примеры надуманы, посмотрите, как основная библиотека ruby ​​описывает Enumerable # map:

# Map → an_enumerator
# -------------------
# Returns a new array with the results of running block once for 
# every element in enum. If no block is given, 
# an enumerator is returned instead.
# Example
(1..4).map { |i| i*i } #=> [1, 4, 9, 16]

Чтобы уловить это на лету, ваш разум должен хорошо разбираться в диапазонах, счетчиках и блоках. Мозг новичка может уже чесаться на второй строчке. Не будет ли проще сказать, что #map - это что-то вроде фабрики?

Вы можете распространить это на любой другой язык или концепцию CS. Обещание JavaScript похоже на билет на самолет - скорее всего, вы получите место (успех), но ваш рейс также может быть отменен (ошибка). Эта стратегия может быть еще более эффективной, если вы подтолкнете учащихся к созданию собственных аналогий. Illustrated.dev содержит отличные примеры и ресурсы по использованию визуального мышления и метафор в веб-разработке.

В конце концов, у ваших учеников вырастут собственные ментальные модели, и вы сможете ссылаться на них, когда будете вводить новые концепции. Например, понимание прототипов JavaScript немного проще, если вы видели классы на другом языке. После того, как вы разобрались с протоколом HTTP, вам будет проще заняться FTP или SMTP. Подчеркивая сходства и различия, вы можете облегчить понимание.

Устранение источников когнитивного шума

Когнитивный шум - это любой вход, который мешает пониманию идеи. Посмотрите это, например:

// Noise on
['foo', 'bar', 'baz'].forEach((x) => { 
	console.log(x)
}
// Noise off
['banana', 'apple', 'pear'].forEach((fruit) => {
	console.log(fruit)
}

Когда мы обрабатываем письменный текст, наш мозг автоматически пытается найти в нем смысл. Если учащийся находит три незнакомых слова без ясного значения, его мозг будет продолжать делать все возможное, чтобы их разгадывать, в то время как другие процессы идут параллельно. Мы, люди, плохо справляемся с параллельной обработкой, это ситуация, которой вы, как тренер по разработке, должны избегать.

Обработка второго примера занимает меньше времени, потому что большинство англоговорящих людей могут иметь отношение к фруктам, а большинство англоговорящих не привыкли читать примеры с метасинтаксисом, такие как «foo-bar-baz».

Закон Хика напоминает нам, что важна каждая добавленная информация. Как разработчики, мы делаем все возможное, чтобы сделать наш код простым для понимания и открытия для других - как тренеры разработчиков, мы должны уделять такое же внимание рефакторингу наших объяснений и примеров, чтобы основные принципы можно было понять как можно проще. .

Советы: избегайте метасинтаксических переменных. Если возможно, начните кодировать свои примеры на чистых файлах и постепенно наращивайте их. Старайтесь не упоминать понятия или аббревиатуры, явно выходящие за рамки учебного контекста. Не упоминайте CSS-in-JS, когда люди только начали работать с CSS. Не упоминайте все, что вы знаете об экосистеме JavaScript, когда ваши ученики только начали работать со своим первым фреймворком. Будь то лекция или разъяснение сомнений 1: 1, наставники-разработчики, которые действительно подкованы, знают, как передать идею действительно ясно, не подавляя свою аудиторию.

Показывать код в естественных условиях

Как и многие другие, мне не нравилась математика в школе. Я помню, как делал упражнения по алгебре и исчислению, как будто они относились к другому миру, который заботился только о правильности - обучение в изолированном пузыре не помогло мне решить что-либо, кроме самих упражнений, а только оказало на меня давление, чтобы я понял ' отвечать. Благодаря этому навыки, которые я приобрел, стали непереносимыми в других контекстах, и проходить через это было утомительно скучно. Был нарушен подход к преподаванию предмета.

Похожая картина может возникнуть с кодированием, когда вы перейдете к таким темам, как метапрограммирование, сложность алгоритмов и параллелизм. Как тренер разработчиков, вы добавляете еще тонну контекста, если показываете, как описываемые вами методы используются в реальных кодовых базах, и, надеюсь, решаете реальные проблемы.

Например, Rails постоянно использует интроспективные возможности Ruby для извлечения уловок метапрограммирования, которые приводят в действие всю магию, создаваемую фреймворком. Отображение жизненного цикла запроса или выполнение работы, выполняемой контроллером, создает много моментов "ага". Такие ресурсы, как Серия видео DHH о том, как писать хорошее программное обеспечение или некоторые разделы Шаблоны проектирования Ruby, действительно хорошо демонстрируют этот принцип.

Сохраняйте ум новичка

Широко признано, что мозг экспертов и новичков работает по-разному. Со временем эксперты учатся применять стратегии и эвристики, оптимизирующие их когнитивные ресурсы. Их подход, когда они занимаются программированием, от прикосновения к клавиатуре до редактирования кода и устранения ошибок, очень, очень отличается от тех, кто только начал.

Если вы преподаватель с многолетним опытом разработки программного обеспечения, легко начать принимать вещи как должное. Хотя вы можете быстро разложить проблему и визуализировать, как связаны файлы в разных контекстах, ваш ученик все еще застревает на строчке кода, еще не совсем понятной. Если вы не сохраните ум новичка, вы рискуете подорвать свое терпение и перейти к рецептам, что помешает учащемуся найти решение самостоятельно.

Многие, многие студенты являются блестящими учениками и очень быстро усваивают концепции - их борьба заключается в том, чтобы преобразовать свои намерения в код просто потому, что концептуализация проблем и отслеживание вашего собственного языка плюс машинный язык - это большая работа для ума новичка.

Визуализация проблемы на доске и разбивка ее частей может работать очень хорошо, даже если проблема кажется тривиальной. Использование и моделирование REPL-управляемой разработки также очень полезно, чтобы помочь студентам быстро получить обратную связь о своем подходе к проблеме без прямого вмешательства тренера. В паре с учащимися я также считаю полезным задавать переориентирующие вопросы, которые позволяют мне понять их точку зрения на проблему в данный момент и начать работать с этого момента:

  • Какова ваша следующая ближайшая цель?
  • Что вы пытаетесь решить прямо сейчас? Каков ваш подход?
  • Что сейчас не совсем понятно?
  • Какая часть проблемы сейчас кажется наиболее сложной или неясной?

Отражение модели и принятие эффективных стратегий

Люди, обучающиеся программированию, ничем не отличаются от обычных пользователей. Мозг учащегося изо всех сил старается удовлетворить, когда он перегружен информацией. Столкнувшись с журналом ошибок, учащиеся могут попытаться уловить запах журнала, а затем случайным образом изменить строку кода здесь или там, не останавливаясь, чтобы понять поведение кода.

Важно обнаруживать эти признаки на ранней стадии - по моему опыту, студенты, которые прибегают к «удовлетворению» и полагаются на стратегии сбора информации по умолчанию, как правило, чаще испытывают переполнение, больше разочаровываются и остаются сосредоточенными на более короткие периоды времени.

Например, подталкивание учащихся к использованию псевдокода на ранней стадии и часто имеет очень большое значение в будущем. Псевдокод - это инструмент, который помогает учащимся уточнить свои намерения перед написанием кода и поможет им обнаружить пробелы в том, что они знают, и в том, что, как они знают, возможно, но они еще не знают, как реализовать.

Именно из-за того, что псевдокод заставляет вас глубоко задуматься о проблеме, мне пока не удалось убедить людей просто сделать это (састисфикс означает, что люди пойдут по пути наименьшего сопротивления). Моделирование, исследование, обучение и решение проблем с помощью псевдокода, как правило, более эффективны.

В соответствии с этим также важно, чтобы ваши ученики выполняли работу, считывали ошибки и активно выясняли поведение кода, который они пишут. Делая это для них, вы не позволяете им разрабатывать и интериоризовать ключевые концепции. Пример:

Нормальное обучающее мероприятие

**student and coach work on a script** 
- student: I need help, I am not sure why my program crashed.
- coach: Ok, show me your editor.
** coach takes control of the keyboard **
- coach: You see what is going on? You called the method 'parse'. However, you did not define parse anywhere else in your program. 
- student: Oh, I did not realise.
- coach: You need to define the parse method in your scraper class, if you want it to work. Does that make sense? 
- student: Yep, makes sense. I'll give it a try.

Более эффективное обучение

**student and coach work on a script** 
- student: I need help, I am not sure why my program crashed.
- coach: Ok, run your code and let's look at the error.
- coach: Let's see what's going on. The error says 'undefined method
parse for scraper'. Can you see at which line?
- student: Yeah, it says line 16 in the parser.rb file
- coach: what do you think that could mean?
- student: I have don't have a method called 'parse', 
but I thought Ruby included it by default? I guess it doesn't.  
- coach: So what could you do about it?
- student: I could define it as a method, but where?
- coach: Let's check the error again. Who is asked to run the parse method?
- student: Ah now I see! I need to go to the Scraper class and write it there. I'll start off with some pseudocode. 
- coach: Great stuff, go give it a try.

Пример может показаться тривиальным, но принцип, лежащий под ним, очень силен. Первый пример указывает на специфические для ситуации ошибки, не помогая учащемуся разобраться в коде. Тренер упустил шанс задействовать метапознание ученика. Во втором примере тренер подталкивает ученика к самостоятельному рассуждению, развивая привычки устранения неполадок, которые хорошо переносятся во многих различных ситуациях.

Подведение итогов

Чтобы научить людей создавать собственные продукты, нужны не только технические знания. Ключевые моменты:

  • Автоматизируйте скучные вещи. Используйте процедуры и упражнения, которые помогут учащимся быстро закрепить основы синтаксиса и другие фундаментальные знания, чтобы они могли направить свой ум на работу в высших целях.
  • Наденьте тренерскую шляпу. Прививайте своим ученикам установку на рост, верьте в них, понимайте, что ими движет, и работайте, чтобы понять, как они воспринимают проблемы и думают о них.
  • Постоянно нажимайте на метапознание. Используйте методы и инструменты, которые делают мыслительные процессы явными и работают над их совершенствованием. Визуализируйте проблемы, поощряйте диалог вокруг кода, псевдокода и модельных стратегий, которые укрепляют хорошие инженерные навыки.
  • Упростите ввод. Делайте ваши объяснения и примеры связанными, когда вы вводите новые концепции. Опирайтесь на аналогии и постепенно переходите от очень простого к наиболее сложному.

Спасибо, что дочитали до этого места! Меня зовут Мигель, и я занимаюсь продуктами и развитием Le Wagon в Сингапуре 🇸🇬 .

Если вы хотите обменяться мнениями о том, как создать выдающийся опыт обучения в сфере технологий, не стесняйтесь обращаться ко мне по адресу [email protected].