Перевод рассказа об опыте обучения программированию группы школьников, с использованием языка Go. Оригинальный текст в почтовой рассылке тут
(ориг. фото)
Привет Гоферы,
я хотел бы описать мой опыт применения Go в качестве первого языка программирования для группы юных программистов. Я знаю, что на эту тему уже были посты (тут и тут), но они в основном касались обучения студентов, или, как минимум, взрослых. Также есть презентация на GopherCon от Одри Лим про её первый опыт программирования и Go.
Также недавно Мартин Купманс спрашивал советы на данную тему для своего сына.
И это первый подобный пост, который я нашел, связанный напрямую с обучением детей.
Моя ситуация была похожа на ситуацию Мартина. У меня была группа из двенадцати 11-летних школьников. В течении всего 7-недельного курса, примерно 12-13 часов, я смог их обучить Go в достаточной мере, чтобы они могли написать генератор фракталов Мандельброта. Но, что гораздо более важно, они понимали и разбирались в коде.
Что я понял из этого опыта, так это то, что Go не только хороший язык для обучения, но и что он великолепен для полных новичков в программировании, в том числе детей. Я попытаюсь обрисовать те аспекты Go, которые действительно важны, когда вы имеете дело с юными программистами, и как я пришёл к этим выводам.
Первый аспект, который помогал это синтаксис, читающийся слева направо. Если вам одиннадцать, то это схватывается интуитивно, потому что Go-код читается естественно, как текст. Это становится очень явным, когда вы спрашиваете детей, что они думают про ту или иную строку кода.
Второе, в Go мало ключевых слов. Если вы ребенок, то это становится важным, потому что создает ощущение, что учить не так уж и много. Изначально это позволяет детям трансформировать проблему обучения программированию в «Что эти слова означают и как их использовать?». После этого, проблема выглядит решаемой.
Третье, go fmt оказался незаменимым помощником сразу по многим пунктам. Это сильный прирост уверенности для детей, когда они знают, что они могут просто писать код и не волноваться про правильное форматирование, зная, что редактор, с помощью go fmt, подравняет код за них. Через некоторое время они привыкают к Go стилю и просто начинают сами писать также естественным образом.
Go fmt, по своей природе, приводит любой код к одинаковому стилю, и это имело интересный побочный эффект. Когда (но не если) дети спонтанно начинали помогать друг другу, и сравнивали программу, которая работает, с программой, которая не работает, они не смотрели на форматирование, а фокусировались на логике. Они фактически сравнивали последовательности шагов в каждой программе, чтобы найти отличия и исправить проблему. Go fmt уменьшает умственные усилия, необходимые для этого — без него, этот процесс занимал бы больше времени, так как отнимал бы больше умственных усилий, потраченных на продирание сквозь различия в форматировании. Так что go fmt оказался фактическим помощником в обучении и понимании. Он уменьшал для детей барьеры для понимания кода. Мой вывод из всего этого в том, что 11-летние нуждаются в go fmt по тем же причинам, по которым в нём нуждаемся и мы.
Четвертое, это go tool и рабочее пространство. Go tool сильно упрощает процесс для юных программистов. Как только они узнают, что всё, что им необходимо, это запустить «go run», они больше никогда не спрашивают, как запустить другую программу. Я им показал это буквально 2 или 3 раза. Я просто не могу представить подобное с помощью Makefile-ов или параметров командной строки. Это так просто, что дети просто это схватили моментально.
Рабочее пространство также помогало. Просто узнав, что им достаточно положить код в $GOPATH/src, чтобы всё работало, очень помогало, так как принуждало всех это делать. Детям не пришлось сталкиваться с ситуацией, что их программа не запускается, потому что она (или зависимости) находится в неправильном месте.
Когда я начал этот проект, я считал, что у детей будут хорошие шансы быстро освоить Go. Но всё же было несколько тем, которые по моему мнению могли бы быть проблематичными для объяснения.
Интересный случай тут представляют собой типы данных. Я думал, что для детей это будет по-настоящему сложный концепт для понимания, потому что он достаточно сильно абстрагирован. Именно по этой причине наиболее часто для обучения программированию используются «безтиповые» языки программирования. Но всё было с точностью до наоборот. Дети просто ухватили это на раз. Им достаточно было раз или два совершить ошибку с присвоением строки числовой переменной, чтобы понять, что компилятор им этого не даст сделать. Статическая проверка типов компилятора тут реально помогала, потому что она останавливала детей и говорила — тут есть проблема.
Но, конечно, типы ещё и действительно помогали. Дети должны были обосновывать, какой тип они выбирают, когда они объявляли переменную первый раз. Они разговаривали о том, для чего они хотят ту или иную переменную и затем выбирали нужный тип. Почти незаметно для них, это расширило их логические мыслительные способности.
Вместо IDE, я использовал редактор Atom и командную строку, чтобы учить детей. Я опасался, что отсутствие UI и кнопки «Старт» может быть проблемой для детей. Но они доказали мне обратное. Имея редактор с подсветкой синтаксиса, с интеграцией с go fmt, и зная, как собирать/запускать их программы, это не было проблемой вообще. Использование командной строки также не стало проблемой. Также, им не нужен был дебаггер. Когда их программы делали что-то неправильно, они просто возвращались в редактор, меняли код, пересобирали и пробовали ещё раз. Цикл исправить/собрать/запустить в Go настолько быстр, что им просто не нужен был дебаггер. Использование дебаггера каждый раз сильно бы их тормозило. Хотя, это может быть, отчасти, связано с маленьким размером проектов, которые они писали.
Фигурные скобочки для маркировки блоков тоже не были для детей проблемой. Дети банально про это никогда и не спрашивали. Возможно, это отчасти потому что go fmt всегда поправлял выравнивание скобочек. А возможно, потому что они никогда не программировали раньше, поэтому и не имели предвзятых убеждений по поводу наличия или отсутствия фигурных скобок. На данный момент я сам не до конца понял, что здесь первопричина для детей. Когда они забывали поставить скобочку, очень быстро они запоминали ошибку компилятора, которая об этом сообщала, и искали, где они пропустили скобку.
Какие выводы я могу из этого сделать? Не думаю, что команда авторов Go когда либо позиционировала язык, как хороший язык для обучения с нуля, но, по счастливой случайности, мы, похоже, имеем и хороший системный язык, и хороший язык для обучения программированию. Редкий подвиг, безусловно. Единственное, чем я могу это объяснить, это сам процесс дизайна языка. Выбрасывая больше, чем оставляя, и держа в главном приоритете простоту и ортогональность — как языка, так и тулинга — это оплатилось сполна, причем такой стороной, которую изначально мы даже не представляли.
Как говорили Расс Кокс и Эндрю Герранд на конференции GopherCon в этом году, мы, как сообщество, не должны терять из виду эти изначальные принципы Go, по мере развития языка. Если мы будем забывать о них, мы рискуем испортить жизнь как будущим программистам, так и себе.
И напоследок, если кто-то ещё пробовал Go, как первый язык программирования, особенно для детей, я буду очень рад услышать ваш опыт.
У меня также есть планы обучать большую группу и в течении большего периода, начиная с этого сентября.
С уважением,
Оуен.
(ориг. фото)
Привет Гоферы,
я хотел бы описать мой опыт применения Go в качестве первого языка программирования для группы юных программистов. Я знаю, что на эту тему уже были посты (тут и тут), но они в основном касались обучения студентов, или, как минимум, взрослых. Также есть презентация на GopherCon от Одри Лим про её первый опыт программирования и Go.
Также недавно Мартин Купманс спрашивал советы на данную тему для своего сына.
И это первый подобный пост, который я нашел, связанный напрямую с обучением детей.
Моя ситуация была похожа на ситуацию Мартина. У меня была группа из двенадцати 11-летних школьников. В течении всего 7-недельного курса, примерно 12-13 часов, я смог их обучить Go в достаточной мере, чтобы они могли написать генератор фракталов Мандельброта. Но, что гораздо более важно, они понимали и разбирались в коде.
Что я понял из этого опыта, так это то, что Go не только хороший язык для обучения, но и что он великолепен для полных новичков в программировании, в том числе детей. Я попытаюсь обрисовать те аспекты Go, которые действительно важны, когда вы имеете дело с юными программистами, и как я пришёл к этим выводам.
Первый аспект, который помогал это синтаксис, читающийся слева направо. Если вам одиннадцать, то это схватывается интуитивно, потому что Go-код читается естественно, как текст. Это становится очень явным, когда вы спрашиваете детей, что они думают про ту или иную строку кода.
Второе, в Go мало ключевых слов. Если вы ребенок, то это становится важным, потому что создает ощущение, что учить не так уж и много. Изначально это позволяет детям трансформировать проблему обучения программированию в «Что эти слова означают и как их использовать?». После этого, проблема выглядит решаемой.
Третье, go fmt оказался незаменимым помощником сразу по многим пунктам. Это сильный прирост уверенности для детей, когда они знают, что они могут просто писать код и не волноваться про правильное форматирование, зная, что редактор, с помощью go fmt, подравняет код за них. Через некоторое время они привыкают к Go стилю и просто начинают сами писать также естественным образом.
Go fmt, по своей природе, приводит любой код к одинаковому стилю, и это имело интересный побочный эффект. Когда (но не если) дети спонтанно начинали помогать друг другу, и сравнивали программу, которая работает, с программой, которая не работает, они не смотрели на форматирование, а фокусировались на логике. Они фактически сравнивали последовательности шагов в каждой программе, чтобы найти отличия и исправить проблему. Go fmt уменьшает умственные усилия, необходимые для этого — без него, этот процесс занимал бы больше времени, так как отнимал бы больше умственных усилий, потраченных на продирание сквозь различия в форматировании. Так что go fmt оказался фактическим помощником в обучении и понимании. Он уменьшал для детей барьеры для понимания кода. Мой вывод из всего этого в том, что 11-летние нуждаются в go fmt по тем же причинам, по которым в нём нуждаемся и мы.
Четвертое, это go tool и рабочее пространство. Go tool сильно упрощает процесс для юных программистов. Как только они узнают, что всё, что им необходимо, это запустить «go run», они больше никогда не спрашивают, как запустить другую программу. Я им показал это буквально 2 или 3 раза. Я просто не могу представить подобное с помощью Makefile-ов или параметров командной строки. Это так просто, что дети просто это схватили моментально.
Рабочее пространство также помогало. Просто узнав, что им достаточно положить код в $GOPATH/src, чтобы всё работало, очень помогало, так как принуждало всех это делать. Детям не пришлось сталкиваться с ситуацией, что их программа не запускается, потому что она (или зависимости) находится в неправильном месте.
Когда я начал этот проект, я считал, что у детей будут хорошие шансы быстро освоить Go. Но всё же было несколько тем, которые по моему мнению могли бы быть проблематичными для объяснения.
Интересный случай тут представляют собой типы данных. Я думал, что для детей это будет по-настоящему сложный концепт для понимания, потому что он достаточно сильно абстрагирован. Именно по этой причине наиболее часто для обучения программированию используются «безтиповые» языки программирования. Но всё было с точностью до наоборот. Дети просто ухватили это на раз. Им достаточно было раз или два совершить ошибку с присвоением строки числовой переменной, чтобы понять, что компилятор им этого не даст сделать. Статическая проверка типов компилятора тут реально помогала, потому что она останавливала детей и говорила — тут есть проблема.
Но, конечно, типы ещё и действительно помогали. Дети должны были обосновывать, какой тип они выбирают, когда они объявляли переменную первый раз. Они разговаривали о том, для чего они хотят ту или иную переменную и затем выбирали нужный тип. Почти незаметно для них, это расширило их логические мыслительные способности.
Вместо IDE, я использовал редактор Atom и командную строку, чтобы учить детей. Я опасался, что отсутствие UI и кнопки «Старт» может быть проблемой для детей. Но они доказали мне обратное. Имея редактор с подсветкой синтаксиса, с интеграцией с go fmt, и зная, как собирать/запускать их программы, это не было проблемой вообще. Использование командной строки также не стало проблемой. Также, им не нужен был дебаггер. Когда их программы делали что-то неправильно, они просто возвращались в редактор, меняли код, пересобирали и пробовали ещё раз. Цикл исправить/собрать/запустить в Go настолько быстр, что им просто не нужен был дебаггер. Использование дебаггера каждый раз сильно бы их тормозило. Хотя, это может быть, отчасти, связано с маленьким размером проектов, которые они писали.
Фигурные скобочки для маркировки блоков тоже не были для детей проблемой. Дети банально про это никогда и не спрашивали. Возможно, это отчасти потому что go fmt всегда поправлял выравнивание скобочек. А возможно, потому что они никогда не программировали раньше, поэтому и не имели предвзятых убеждений по поводу наличия или отсутствия фигурных скобок. На данный момент я сам не до конца понял, что здесь первопричина для детей. Когда они забывали поставить скобочку, очень быстро они запоминали ошибку компилятора, которая об этом сообщала, и искали, где они пропустили скобку.
Какие выводы я могу из этого сделать? Не думаю, что команда авторов Go когда либо позиционировала язык, как хороший язык для обучения с нуля, но, по счастливой случайности, мы, похоже, имеем и хороший системный язык, и хороший язык для обучения программированию. Редкий подвиг, безусловно. Единственное, чем я могу это объяснить, это сам процесс дизайна языка. Выбрасывая больше, чем оставляя, и держа в главном приоритете простоту и ортогональность — как языка, так и тулинга — это оплатилось сполна, причем такой стороной, которую изначально мы даже не представляли.
Как говорили Расс Кокс и Эндрю Герранд на конференции GopherCon в этом году, мы, как сообщество, не должны терять из виду эти изначальные принципы Go, по мере развития языка. Если мы будем забывать о них, мы рискуем испортить жизнь как будущим программистам, так и себе.
И напоследок, если кто-то ещё пробовал Go, как первый язык программирования, особенно для детей, я буду очень рад услышать ваш опыт.
У меня также есть планы обучать большую группу и в течении большего периода, начиная с этого сентября.
С уважением,
Оуен.