Как я преподавал, а потом методичку по Python писал

    image

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

    Итак, работал я преподавателем по Python и по Java. Этот УЦ закупал методические материалы для Java, а Python они запустили, когда пришёл я и предложил им это.

    Методичку для учеников (по сути учебник или самоучитель) я писал по Python, но не малое влияние оказало преподавание Java и методические материалы, которые использовались там.

    Сказать, что они были ужасными — ничего не сказать. Модус учебника по Java, который поставляет одна очень известная фирма в России, был не в том, что бы научить человека основам данного языка в целом и парадигме ООП в частности, а в том, чтобы родители, приходившие на открытые уроки, видели, как их сыночек или дочка списали с учебника змейку или шахматы. Почему я говорю списали? Очень просто, дело в том, что в учебнике приводились целые листы (A4) кода, некоторые моменты которого не объяснялись. В итоге, преподаватель либо должен контролировать на каком моменте в коде сейчас находиться каждый ученик, объясняя каждую строчку, либо всё скатывается в списывание.

    Вы скажете: «Ну и что такого, пусть препод лучше работает, а шахматы и змейка ваще квёво!»

    Что ж, всё было бы круто, если бы кол-во человек в группе не было под 15, а это уже значительно, коли вы собираетесь следить за всеми, объясняя: «А всё таки, что мы пишем такое?»

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

    Ну и финалочка, разрушающая буквально этот учебник — с самого начала отсутствует хоть сколько-то адекватное введение, объясняющее, что такое типы данных, что они бывают объектные и примитивные, какой критерий проверяет свойство, порождающее эту дихотомию и т.д. В первой же главе, вам и вашим ученикам предлагается сделать (списать) программу, которая делает окошко и пишет там «Привет!», однако там не объясняется, что собственно этот лист кода значит, лишь ссылки на дальнейшие занятия, например, упоминается «main» — точка входа, но даже не проговаривается само понятие «точка входа».

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

    Когда стало понятно, что из УЦ я уйду, а программу по Python надо как-то продолжать в следующем году, я принялся писать свой учебник. Если коротко, то я поделил его на две части, в первой объяснял всё про типы данных, их суть, операции с ними и инструкции языка. Между темами делал QnA, чтобы будущий учитель смог понять, как ученик усвоил тему. Ну и в конце сделал небольшое задание-проект. Первая часть таким образом объясняет основы языка и разжёвывает их, что составляет примерно 12-13 уроков по 30-40 минут. Во второй части я уже написал про ООП, описал чем реализация этой парадигмы в Python отличается от большинства других, делал много ссылок на style guide и т.д. Если резюмировать — я пытался быть максимально не похожим на то, что было в учебнике по Java. Недавно писал нынешнему преподавателю по Python, спрашивал фидбэк по материалам и сейчас я рад, что всё хорошо, что дети реально понимают программирование на Python.

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

    UPD: Как верно заметили в коментария я почти ничего не сказал о подаче материала. Скажу сразу, что я считаю что практики должно быть больше, как можно больше. В конце кажодого занятия в первой части я делал 4-5 небольших практических заданий на тему главы. Между главами были QnA (уроки контроля), где тоже были практические, но уже оцениваемые задания, так же в конце первой части был проект с темой на выбор из предложенных. Во второй же части, я сделал введение в ООП через создание консолькой мини-игры, разраотка которой и была всей второй частью и всем введением в парадигму.

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Учится ли Ваш ребёнок программированию в учебном центре?

    • 6,8%Да5
    • 93,2%Нет68
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 27

      +1
      Планируете выложить наработки на GitHub или подобный сервис?
        +1

        Чем ругать чужой учебник, проще написать свой — лучше конечно

          0

          Ну по python я и написал свой, посмотрев, как не надо) java мне не настолько интересна, чтобы найти время и силы

          +2

          Я, возможно, окажусь непопулярным, но типы данных, антипаттерны и "дихотомия" это чтобы возненавидеть программирование. Я так понял, что про ООП пошло после 6 часов первой главы (12-13 по полчаса). Не надо так


          Когда мне хочется чему-то научиться мне нужен визуальный результат моей работы, будь то "hello world" в консоли, в окне GUI или какой-другой примитивный вывод.

            0

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


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


            Ну и по поводу дихотомии, так несправедливо поставленной, Вами в кавычки, очевидно, что с учениками помладше я такой терминологией не пользуюсь, а вот постарше (15-17), если им просто интересно, хотя бы новые слова узнавать, то почему бы и нет


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

            +1
            Если начать с типов данных — скукота будет несусветная. Больше практики. Больше примеров. Причем, и примеров, на которых разбираются ошибки.

            1. Пишем hello world
            2. Пишем 7 раз hello world
            3. Вот можно и цикл объяснить

            И, кстати, писать игру гораздо увлекательнее, чем разбирать синтетические и скучные примеры ооп. Вот на примере врагов (класс) делаем много соперников (экземпляр класса) которые могут двигаться (методы)… ну и так далее. Где-то видел очень толковый туториал на 14 глав по pygame.

              0

              Про типы: их можно объяснять по разному, я не отказываюсь от hello world в консоль на первом занятии, так как традиция)


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


              В статье я скорее пишу про структуру своих материалов, по поводу наполнения, например, через создание игры — полностью согласен, ибо так и сделал сам)

                0

                Как вы понимаете, что студенты усвоили итерируемые типы, если они циклы еще не изучали? Почему не наоборот?

                  0

                  Это может шокировать, но итерируемые типы != циклы, поэтому под пониманием итерируемых типов, я понимаю усвоение базовых методов, например, есть задание: в коде задан список students — ученики в классе, приходит новенький John, добавьте его в конец списка.


                  Эти две темы идут одна за другой, поэтому я не считаю, что это как то портит впечатление или мешает усвоению

                0

                Поддерживаю. Нужно больше практики, больше примеров и меньше долгих разговоров о теории.


                Но конкретно про циклы добавлю


                1. Пишем hello world
                2. Пишем 7 раз hello world
                3. Вот можно и цикл объяснить

                Это не самый удачный вариант начала объяснения циклов. В первом примере счетчик должен выводиться на экран. Про объяснение циклов у меня целая статья есть.

                  0
                  Циклы разные и нужны для разных задач. И совсем не всегда нужен индекс.
                  for name in ['Masha', 'Mike', 'Alex', 'Olga']:
                  	print "Hello " + name
                  
                  Зачем тут индекс? Просто перебираем все имена и приветствуем людей.

                  Заодно рассмотрим вариант с индексом.
                  names = ['Masha', 'Mike', 'Alex', 'Olga']
                  for i in range(len(names)):
                  	print str(i) + ". Hello " + names[i]
                  
                  Тут и код более громоздкий, и приведение типов. Да и просто для обычного списка и для такой задачи больше подходит 1-й вариант. Для чтения файла построчно удобно использовать while. При обучении как раз надо объяснять разницу «что и для чего».
                    +1

                    В действительности, я, например, сначала показываю ученикам первый "тип" цикла фор на уже изученных списках, а потом показываю for с range, объясняя, что по сути это одно и тоже, и если не вдаваться в определение генератора, то для простоты понимания можно им показать, как range спокойно конвертируется в список и цикл точно так же по нему может идти, давая нам индесы

                      0

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

                        0
                        Именно. Следующий пункт про форматирование очень уместен. Чтобы понять «что лучше», надо также показать «что нехорошо».
                        0
                        Зачем тут индекс? Просто перебираем все имена и приветствуем людей.

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


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


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

                          0
                          Согласен, 7 раз вывести в цикле, не тоже, что перебрать список. И в принципе, неважно, с какого цикла начинать объяснение.

                          Я больше про то, что часто удобнее «плясать» от задач, и сразу делать практику, а уже потом объяснять что есть индексы, типы и пр. Причём, надо разбирать и плохие практики, и потом их рефакторить. Теория очень быстро забывается. Практика остаётся на кончиках пальцев.

                          Тогда и связка список-перебор-цикл не будет восприниматься единым иероглифом.
                    0

                    Любопытно узнать, что именно вы называете "типами данных" и "антипаттернами в коде".
                    Я правильно понимаю, что у вас всего одно практическое задание на первую половину учебника и оно в конце?

                      0

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


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

                        0

                        Я понимаю, что на Хабре в комментах полезной информации бывает больше, чем в статье. Но возводить это в правило считаю плохой идеей. Не могли бы вы добавить разъяснение по моему вопросу в тексте статьи?

                          +1

                          Конечно, как до комухтера доберусь)

                            +1

                            Всё, сделал UPD

                        +1

                        5-й год преподаю в школе по совместительству (вообще я пишу на Си под Linux всякие low-level и high-load вещи и прошивки для FPGA), учу детей в маленьком центре дополнительного образования в Подмосковье.


                        1. Большинство этих центров — шлак, который работает по той же системе, что развлекательные бизнесы (а родители думают, что за деньги получат лучший результат, чем в школе). Особенный треш — кружки робототехники — после них никаких систематических познаний ни в механике, ни в программировании у 99% детей нет — просто хорошо поиграли в чужой Лего за деньги, на которые можно купить свой. На хороших кружках робототехники действительно учат основам программирования на базе Scratch-подобных графических языков, рассказывают про зубчатые передачи, ремни и пр., готовят к НПК. Но уложить и то, и другое за ограниченное количество занятий очень сложно.
                        2. Тех, кто даёт детям, начинающим изучать программирование с нуля, ООП нужно больно бить чем-нибудь тяжёлым. У среднего семиклассника проблемы с отрицательными числами и напрочь забыта Декартова система координат, о том что такое уравнение, выражение и переменная в математике у него самое смутное представление. Они долго и трудно въезжают в алгоритмическую конструкцию "следование" — понятие переменной, как чего-то, что хранит состояние, операция присваивания — это просто взрыв мозга для значительно числа детей 7-9 кл., которые до этого не видели программирования. Если начинать с нуля, то при занятиях раз в неделю с не самыми тупыми детьми можно начинать разговор о ветвлении через месяц-полтора, а о циклах — через три. О массивах — через полгода. Это хороший темп для детей чуть выше среднего.
                        3. Легче всего забыть насколько же мы все были тупыми в их возрасте. Труднее всего не позволять себе гнать вперёд, чётко контролировать настоящие знания каждого (т.е. то, что он/она может сделать сам, без подсказок, подглядок и помощи товарищей)
                        4. Группа должна быть до 15 человек. Если преподаватель хороший, то он даже при таком размере может обеспечить более-менее индивидуальный подход.
                        5. ДОЛЖЕН БЫТЬ ОТБОР. Нельзя сажать вместе "нулевых" и тех, кто уже ходил на районную олимпиаду, только писал на Pascal. Главная тайна всяких гарвардов и пр. "элитных" вузов: средний уровень поступающих — определяющий фактор успеха. С сильной группой можно вести разговор на совершенно другом уровне. Я бы сказал, что сильная группа вытерпит даже не очень хорошего преподавателя, а слабая группа не достигнет ничего даже с очень хорошим.
                        6. Начинать нужно либо с простого функционального языка типа Scheme (но никто сейчас так не делает, даже я только мечтаю), либо с простого процедурного языка или поддерживающего эту парадигму типа Pascal/Python/Go/Javascript или даже C. Java/C#/С++ — плохая идея.
                        7. Вы вряд ли придумаете более хорошую программу, чем уже выстрадана хорошими учителями ещё с советских времён. Зайдите на сайт Полякова (автор учебника), скачайте пару учебников, если у вас есть минимальный опыт преподавания, то вы не будете смотреть на блок-схемы и последовательность простая арифметика — простой ввод/вывод — ветвление — циклы — массивы свысока.

                        Как опознать говённый кружок для детей:


                        • выйти на контакт с преподавателями до оплаты нереально — с вами разговаривают девочки на телефоне, которые назойливо и подлизываясь впаривают товар, при этом не могут поговорить по сути
                        • в группах сильный разброс по уровню (на этапе созвона можно спросить про разброс возраста — если мнутся или говорят, что он больше 3-х лет — сразу до свидания) — да, когда нужно срубить бабла, а народу мало, то 11-классник садится рядом с 7-классником и у них разная скорость освоения материала, потому что какой бы говённой ни была математика в школах, мозги всё-таки как-то растут, в итоге либо одному скучно, либо другой на грани истерики от непонимания
                        • мало практики, нет хорошего домашнего задания каждую неделю, а сами занятия проходят в формате бла-бла-бла у доски или "смотрите как я умею" с трансляцией экрана и просьбой набить то же у себя
                        • с вами никогда не спорят (Ваш Вовочка из 7-го Б хочет программировать игры на C# под Unity? Никогда до этого не программировал, а в школе информатики не было? Но ведь… Всё равно хочет? Ну хорошо, приходите). 99% родителей далеки от тематики образования, сами зачастую школу не любили, и не понимают, что четвёрка по математике превращается в тройку по физике в следующем году и пр.


                        P.S. Министерство образования должно быть распущено в полном составе, вплоть до районных управлений образования. Эти люди просто не нужны. Хорошие преподаватели лучше их знают что и как преподавать, на плохих никакой управы нет, а всё остальное, что имеет значения — это зарплата и помещения.

                          0

                          Начну со второго пункта, так как с первым в принципе согласен :)


                          1. Внимательность прочтения статьи у некоторых людей, просто поражает (бить в таком случаи нужно этих людей). До БАЗОВОГО введения в ООП идёт 40 (!) часов практики и теории (не только по программированию, но и по математике, которая понадобится при освоении материала, у меня так!) + дз + контроль и разбор непонятных тем, по поводу раписываемых темпов, вообще промолчу, видимо, хоть я так и не хочу думать, нам попадались разные дети.


                          2. Собственно, что я и смог сделать, поставив себя на их место.


                          3. Тут тоже согласен, об этом я и пишу в статье.


                          4. Когда я сделал курс по Python, ещё до учебника, то я сделал базовое тестирование, где, например, были вопросы и задачи про переменные, да и вообще необходимым основам алгебры и арифметики.


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


                          6. Скажем так, моя программа (особенно в первой части) основана на базовых понятиях языка (числа, ветвления, итерируемые типы, циклы), чтобы ученик понимал, как можно использовать для решения определённых задач изученные типы и как можно их обрабатывать. "Вы вряд ли придумаете более хорошую программу, чем уже выстрадана хорошими учителями ещё с советских времён." — отсылка к лучшему в мире советскому образованию не котируется, так как помимо всех прочих вопросов, например, почему после распада люди с ТЕХНИЧЕСКИМ ВЫСШИМ побежали заряжать воду от телевизора, есть ещё очевидный момент быстрой изменчивости, как самих языков, так и их парадигм, вводящих новые понятия в программирование. А по поводу смогу ли я придумать или нет — решу сам и практика преподавания по моим материалам (спойлер: регулярно интересуюсь и сейчас всё хорошо)



                          Про мин. просвет согласен, так как в текущем виде понятие преподавательского эксперемента и свободы программы всё больше убивается ФГОСами, что совершенно недопустимо, хотя казалось бы после ввода ЕГЭ...

                            +1
                            1. Да, действительно про 40 часов я упустил, извините. Но я и не видел свой список как критику изначального поста, скорее появилось желание резюмировать.
                              Ещё один момент заключается в том, что в случае обучения с полного нуля каждый лишний кусок информации — плохо. Особенно плохо, если в самом начале требуется делать много "магии": ты сейчас не поймёшь, просто запомни. Когда в самом начале детей сажают в IDE с интерфейсом авиалайнера, они создают папочки "проектов", когда нельзя просто вывести на экран 2+2, а нужно написать


                              #include <stdio.h>
                              int main( void ) {
                              printf("%d", 2+2);
                              }

                              то это реально путает и пугает. Именно поэтому начинать с Java или C#, где шагу нельзя ступить, не создав класс (аналогичный по непонятности и многословности кусок получается), неправильно. И именно в этом плюс Python для обучения. Там можно просто написать


                              print(2+2)

                            2. Это далеко не только мой опыт. То, что уровень поступающих — ключевой фактор, понимают очень много людей. Неспроста многие рейтинги вузов одним из главных факторов берут баллы ЕГЭ поступающих.


                            3. Я имел в виду лучших представителей преподавательского сообщества, а не всех подряд. Посмотрите на списки победителей и призёров олимпиад по информатике Московской области: Дубна, Мытищи, Долгопрудный, Королёв. Вот в таких местах концентрируются талантливые дети (ученики всяких там лицеев при вузах, интернатов и пр., дети работников этих "наукоградов") и соотв. преподаватели. И опять же — я когда писал, то не критиковал напрямую вас — это далеко не первая статья на хабре про эти проблемы и это первый раз, когда я такую статью прокомментировал, поэтому отвечал сразу "облаку воображаемых адресатов". Надо было быть точнее в формулировках.


                              0
                              Особенно плохо, если в самом начале требуется делать много "магии": ты сейчас не поймёшь, просто запомни. Когда в самом начале детей сажают в IDE с интерфейсом авиалайнера, они создают папочки "проектов", когда нельзя просто вывести на экран 2+2, а нужно написать

                              На мой взгляд, написать пару шаблонных строк для базового оформления программы не так уж страшно.
                              Настоящий ужас происходит когда человек решает позаниматься, скачивает, например, visual studio code и для того, чтобы сделать простой проект, ему нужно поставить пару плагинов, написать в PATH какую-нибудь штуку и запустить магическую команду в командной строке.
                              Ну или как у меня на домашнем компьютере недавно случилось. Решил я поставить питон для тестов на селениуме. Казалось бы, вот самый простой язык, который всем рекомендуют для начала. Пробую запустить интерпретатор, а он выдает 0x000005 при запуске. Пришлось разбираться, почему он не видит системные библиотеки и решать конфликты между x64 и x86 либами от VC++Redistributable. Ни один человек "с нуля" такое уж точно не провернет.


                              В этом смысле IntellijIDEA от JetBrains — просто божественна. Скачивается одним файлом, устанавливается по алгоритму "далее, далее, ок". Можно создать всего один проект и запускать любой произвольный класс с main одним кликом.
                              Ну а то, что там нужно создать файлик с классом и "потом поймете" — совсем не проблема.


                              Вы вряд ли придумаете более хорошую программу, чем уже выстрадана хорошими учителями ещё с советских времён. Зайдите на сайт Полякова (автор учебника), скачайте пару учебников, если у вас есть минимальный опыт преподавания, то вы не будете смотреть на блок-схемы и последовательность простая арифметика — простой ввод/вывод — ветвление — циклы — массивы свысока.

                              Я имел в виду лучших представителей преподавательского сообщества, а не всех подряд. Посмотрите на списки победителей и призёров олимпиад по информатике Московской области: Дубна, Мытищи, Долгопрудный, Королёв. Вот в таких местах концентрируются талантливые дети (ученики всяких там лицеев при вузах, интернатов и пр., дети работников этих "наукоградов") и соотв. преподаватели.

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


                              За ссылку на Полякова спасибо.

                                0

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

                          0
                          Кроме языка Python можно попробовать Lua. Он достаточно простой и мощный, чтобы на нём лепить всякие интересные штуки и запустить их на практически любом PC, который вообще работает.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое