О главном критерии хороших образовательных курсов

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

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

Современное образование кишит примерами, когда на этот принцип просто-напросто кладут хер. Я могу привести хоть сотню примеров. Давайте приведу пример из матана. Есть такая суперизвестная теорема (Больцано—Коши): если функция непрерывна и принимает на некотором отрезке значения A и B, то принимает и любое промежуточное значение между ними. Догадываетесь, какая естественная реакция на эту теорему у школьников/студентов, которые слышат о ней впервые? “Вы чё, слепые что ли, очевидно это так, нахрен мы это доказываем, чем мы вообще занимаемся?” Даже в МФТИ существенный процент студентов на 1 курсе не понимает, зачем формально доказывать то, что по рисунку очевидно. Если же взять среднее по России, то я вас уверяю, этого не понимают более 90% студентов, изучающих эту теорему, и я боюсь, что даже 99%. Как решить эту проблему? Есть два пути. Первый путь – показать студентам примеры “диких” функций (например, канторову лестницу) до того, как начинать формально доказывать такие штуки. Так можно было бы делать на физтехе, мехмате и еще в паре-тройке мест, где студентам реально интересно понять матан. Второй путь – и это было бы полезнее для большинства вузов – забить хрен на это доказательство и заниматься более прикладными вещами, вместо того чтобы заставлять студентов тупо переписывать буковки.

Вот вам еще пример. Есть такое замечательное понятие “группа” в алгебре. А есть понятие “разрешимая группа”: это такая группа, у которой ряд коммутантов заканчивается на тривиальной группе. (Чево, блять?) Если открыть курс лекций по теории групп ФПМИ (хоть этот, хоть этот), можно увидеть, как лектор с упоением вводит это определение, доказывает свойства, критерии… Если вас, как и меня в те времена, не покидает вопрос “зачем”, то проблема не в вас, поверьте. Это нормальная реакция на определения, которые взяты с потолка и не мотивированы абсолютно ничем. На самом деле, конечно, понятие разрешимой группы придумано не просто так по приколу, а для доказательства утверждения, известного многим школьникам: невозможность решения в общем виде уравнений 5-й степени и выше. Есть наглядное объяснение, как разрешимые группы позволяют понять, почему для уравнений 5-й степени не существует формулы корней. Но в курсе лекций по теории групп – ни слова о нем. Более того: в этом курсе лекций не упоминается даже сама эта проблема, ради которой придумано понятие разрешимой группы! Зато так прикольно, наверное, доказывать свойства этих групп, без малейшей идеи о том, для чего мы их изобрели.

Продолжим тему алгебры (опять математика, извините, но у меня травма со студенческих лет, войдите в положение). Есть такое понятие “идеал кольца”. В различных учебниках и курсах лекций можно услышать фразу, мол, идеал – одно из основных понятий общей алгебры. Про идеалы рассказывают и в том курсе теории групп, который я упоминал выше. А сможете ли вы найти учебник или курс лекций, где было бы рассказано, для решения какой проблемы были придуманы идеалы колец (да и сами кольца вообще) и как свойства идеалов колец решили поставленную проблему? Когда я узнал ответ на эти вопросы, это звучало как божественное откровение, не иначе. На самом деле, все эти понятия: кольцо, идеал, главный идеал, факториальное кольцо, область главных идеалов – были изначально придуманы в попытках доказать великую теорему Ферма. (Теорему о том, что a^n+b^n=c^n не бывает верно при n>2, если кто не знает.) А именно, дело было так: некий челик якобы доказал эту теорему, рассмотрев специальные подмножества комплексных чисел, которые и назывались кольцами. Но потом оказалось, что он неявно ошибочно предположил, что во всех таких кольцах разложение на простые множители однозначно. Потом выяснилось, что это вовсе не так, и чтобы эту проблему устранить, пришлось ввести понятие “идеальных чисел”, а следом – понятия идеалов колец и главных идеалов. После чего получилось доказать, что даже если разложение на простые множители неоднозначно, иногда великая теорема Ферма всё же верна — благодаря теории идеалов колец. Можете почитать подробности этой детективной истории вот в этой книжке. Но детективную историю забыли и поставили на далекую полку, а вот доказывать студентам свойства идеалов колец без малейшего упоминания, нахрена их вообще придумали, — это мы конечно же рады стараться! Не правда ли, коллеги?

Я уже сказал, что могу привести еще сотню примеров, и мне бы так и хотелось сделать, но тогда никто не дочитает. Поэтому лишь озвучу еще пару примеров без подробностей. Когда вы начинали изучать комплексные числа, говорили ли вам, что вообще-то их изначально придумали для решения кубических уравнений, и показывали ли, как комплексные числа помогают их решать? Думаю, что нет, а вам просто ввели i^2 = -1, и поехали. Когда вам рассказывали про интеграл Фурье и преобразование Фурье, показывали ли вам, как прийти к этой формуле из геометрических соображений, и объясняли ли, что так можно наглядно вычленять главные частоты из радиосигнала? Думаю, что нет, а просто ввели интеграл f(x)exp(-iwx)dx, и вперед. Кстати, из комментариев под видео можно сделать вывод, что эта проблема (ввод формулы без наглядного обяъснения) – не специфичная для России. Англоязычные комментарии с текстом вида “сколько же времени я дрочил эту формулу без понимания, пока не наткнулся на это видео” говорят сами за себя.

Конечно, да, я понимаю отговорки преподов: слишком мало времени выделено на предмет, а пройти надо слишком много, всего не покажешь, ко всем идеям не успеешь подвести. Но, во-первых, я уже сказал: плох тот препод, который даже не пытается мотивировать то, что он рассказывает. Разумеется, в семестровом курсе теории групп не расскажешь целиком историю про неудачные доказательства великой теоремы Ферма и про тернистый путь с изобретением колец главных идеалов для решения проблемы. Но ведь хотя бы упомянуть об этом можно? А чего стоит ввести комплескные числа не как взятые с неба числа со свойством i^2=-1, а как инструмент решения для известной задачи? А интеграл Фурье – как способ записи геометрической идеи с наматыванием волны на окружность и вычленения из нее главных частот? Мне кажется, есть две причины, почему преподы этого не делают. Они или сами не до конца знают, о чем рассказывают, или им просто наплевать, поймут ли студенты их рассказ. Да-да, я понимаю этот тезис (уж я-то точно), что идеалы колец и вообще все эти понятия в абстрактной алгебре – такие офигенные и красивые штуки, что кто не преисполнился, тот сам дурак. Но я хочу сказать, обращаясь к каждому из преподов: дорогой друг, если ты читаешь материал в первую очередь сам для себя, а не для слушателей, которые пока еще не ощущают красоты твоих теорем и которых надо сначала подвести к этой красоте – то ты плохой препод. Да, идеалы колец и разрешимые группы – это офигеть как красиво, но только если ты сначала покажешь людям, как к этому прийти, а не просто вывалишь на них из головы весь список известных тебе определений и свойств.

Но всё же хватит про математику, давайте поговорим о программировании и других айтишных дисциплинах. Возьмем язык C++. Одна из самых сложных для понимания тем, которые требуют осознания – move-семантика. В интернете сотни статей, в которых каждый на свой лад пытается объяснить, что это такое. Казалось бы, при таком количестве доступного материала как можно не разобраться в теме? Да просто почти весь материал – говно, извините за выражение. Вот, например, отвратительная статья с первой страницы выдачи гугла. Если вы до ее прочтения ничего не знали про move-семантику, то вы так ничего и не поймете после прочтения, у вас будет каша в голове. Статья начинается с определений lvalue, prvalue и xvalue, которые не мотивированы ничем. Эти определения, помимо того что немотивированные, еще и неверные, а понятие xvalue (вопреки частому заблуждению) вообще не имеет отношения к move-семантике и только мешает ее понять, а не помогает!!! И так происходит постоянно: на вас вываливают кашу из определений, показывают взятые с неба примеры, вместо того чтобы объяснить, ради какой проблемы изначально всё это придумано, а потом показать, как эта проблема решается.

Давайте возьмем еще одну тему из C++, покрытую мраком: корутины. Погуглим по словам “корутины C++” и откроем первую ссылку с якобы объяснением, что это такое. И снова – это отвратительная статья. Ну нихрена же не понятно. Абзац “что такое корутины” начинается с предложения: “Я впервые столкнулся с корутинами, увидев инструкцию yield в CLU”. (Чево, блять?) Чувак, а что такое корутины, ты объяснить не хочешь? Тебя не смущает, что читатель может не знать, что такое yield и что такое CLU (эти вещи знать для понимания корутин и не требуется), а еще – и это самое главное – читателю похер, когда ты с ними впервые столкнулся? Ну ладно, читаем следующее предложение: “Корутины <...> определяются с использованием функционального синтаксиса, а доступ к ним организуется с применением синтаксических конструкций цикла for”. В третьем и четвертом предложениях снова используется слово “корутины”, но так и не дается даже определения, не говоря уже о мотивировке. То есть серьезно, автор этой статьи решил начать объяснение “что такое корутины” с того, что изложил несколько “интересных фактов” про корутины, ладно бы не дав подводки к определению, но не дав даже самого определения. Это и есть то, что я называю изложением материала для себя самого, а не для читателей. И большинство статей в интернете устроено именно так. Иначе бы все быстро поняли, что такое move-семантика и корутины, и они бы не казались такими сложными, не правда ли? (Впрочем, если истинная цель статьи — не объяснить корутины, а показать, какие крутые и умные чуваки работают в компании wunderfund, то с этой целью статья справляется отлично, и я совершенно их не осуждаю за такой самопиар.)

Еще одна наболевшая история, о которой невозможно молчать, -- это предмет под названием “операционные системы” (в народе называемый АКОС) и то, как он обычно преподается в вузах. Давайте откроем какой-нибудь классический курс лекций, например, вот этот (у меня в свое время был примерно такой же). Первая лекция – вам рассказывают историю операционных систем начиная с 60-х годов прошлого века, параллельно вводя термины, которые никак не соотносятся с вашим жизненным опытом, а главное – с которыми вы никогда уже и не встретитесь на практике. Вторая лекция – вам начинают рассказывать: бывают ОС с микроядром, а бывают с монолитным ядром. Свойства монолитного ядра такие-то. Свойства микроядра такие-то. А кстати, бывает еще гибридное ядро. (И снова: чево, блять?) Это мне напоминает заучивание фактов вроде “Валки Вилкинсен был пост-утопистом” из статьи про окупаемость убеждений, на которую я уже ссылался раньше. Вы строите целую сеть определений и фактов, связанных только друг с другом, но никак не связанных с вашими наблюдениями, прошлым опытом, ранее изученными вещами. Примерно как ввести понятия идеалов колец или разрешимых групп до того, как вы хотя бы осознаете, что такое кольца и группы. Проблема в том, что с точки зрения лектора эти понятия – микроядро и монолитное ядро – вполне осязаемые, он-то с ними работал, он проходил этот путь, но не современные студенты. Когда я в универе слушал курс по операционнным системам 12 лет назад, меня не покидало неприятное чувство, что я прослушал целую лекцию и вроде бы она длилась полтора часа, но я не узнал ничего. А всё потому, что материал был именно таким: абсолютно оторванным от того мира понятий, в котором живу я. Мне казалось, что со мной что-то не так, раз я не понимаю, но сейчас я считаю себя вправе заявить: нет, со мной было все нормально, просто если курс построен так, то это плохой курс. Он устаревший. Он не дает студентам понимания вещей, это рассказ ради красивого рассказа, а не ради того, чтобы слушатели что-то осознали.

Как должен быть устроен хороший курс по операционным системам сегодня? Он точно должен начинаться не с истории развития вычислительной техники. И не с программирования на ассемблере, и не с классификации операционных систем по типу их ядра. Хороший курс ОС должен в первую очередь отвечать людям на вопрос, который у них к началу курса уже сформирован: вот мы постоянно пользуемся такими-то функциями и командами, а как они работают? Как реализованы вывод на консоль, выделение памяти через malloc, что на самом деле такое segmentation fault? И только тогда, когда студенты в принципе поймут, что такое “ядро операционной системы” (поработав с ним), можно говорить про типы ядер. А можно про них и вообще не говорить, потому что не знаю ни одного раза, когда бы эта классификация пригодилась на практике, разве что если реализовывать свою ОС (но для этого нужен специальный отдельный курс, а не этот).

Напоследок скажу еще про две проблемы, а заодно отвечу на возражения, которые, возможно, у кого-то возникли. Первая проблема – о ней я уже вскользь упоминал – это разношерстные по уровню начальных знаний студенты. Что делать, если в группе у тебя 5 человек, которые уже всё видели и пробовали, им подавай задротские факты, а остальные 10 – новички, которым нужно разжевывать с нуля? Ответ зависит от цели ваших занятий. Если цель – подготовить лучших из лучших, пусть и потеряв кого-то по дороге, то ответ – херачим вперед, не глядя на отстающих. И именно это – причина, по которой учебные программы физтеха или мехмата можно частично оправдать. От вас при поступлении уже как бы ожидают, что вы понимаете, зачем нужны комплексные числа, зачем нужно формальное определение предела функции, зачем нужны инкапсуляция и наследование в C++. И тем не менее, даже на физтехе изначально это понимают не все поступившие. Интересами тех, кто не понимает, приходится жертвовать.

Конечно, лучший выход – разбить студентов на группы по начальному уровню знаний и обучать разные группы по разным программам. И тут возникает крайне интересный феномен. Почти всегда, будь это первый курс физтеха или летняя школа по олимпиадной математике, обнаруживается, что никто не хочет попасть в “слабую” группу. Если вы делите изначально мотивированных студентов на группы по уровню подготовки, то будьте готовы, что вам придется отвечать на шквал просьб вида “возьмите меня в группу посильнее, пожалуйста, я очень хочу заботать предмет получше”. Особенно иронично звучат просьбы вида “переведите меня в группу посильнее, а то я на первом занятии всё понял” (и я не выдумываю, это реальные сообщения от реальных людей). Студенты в начале первого курса массово не понимают, что “группа посильнее” и “группа, в которой получится лучше заботать предмет” – это разные группы. Ведь “группа посильнее” – это группа, в которой уже не нужно мотивировать многие понятия, а можно вводить их сразу, с потолка, потому что люди и так к ним готовы! Но это как раз означает, что у остальных, кто не был готов, образуется каша в голове вместо лучшего понимания предмета. Я, кстати, и сам таким был. В первом семестре своего первого курса я прорвался в продвинутую группу по C++ именно с такой мотивацией – хотел к концу обучения знать больше, чем остальные. Я нихрена не был готов к тем вопросам и задачам, которые ждали меня там в первый же месяц, для меня они были абсолютно оторваны от мира моих понятий. Как итог, за первый семестр я получил уд(3) с натяжкой, не сдав ни одной задачи и не поняв ничего, после чего перевелся в “группу послабее” – в основной поток – и там нагонял людей, которые уже много чего поняли за первый семестр.

Вторая проблема из тех, о которых я обещал упомянуть, -- это изначальная мотивированность студентов изучить некоторые понятия даже без понимания, зачем они нужны, и немотивированность изучать другие, даже если они более полезны на практике. Например, очень часто школьники в старших классах сами просят научить их вычислять производные и интегралы – не потому что это для чего-то полезно, а потому что все слышали о них с детства как о чем-то крутом и сложном. Так уж принято считать, что интегралы – это своего рода символ “сложной математики”, и школьникам хочется заботать их просто затем, чтобы приобщиться к культу, так сказать. Поэтому в курсе матана на физтехе можно не объяснять, зачем нужны производные и интегралы: студенты изначально готовы к тому, что предстоит их изучать, и сами хотят этого. Но вовсе не так обстоит дело с формальным определением непрерывности, которое хоть гораздо важнее, но выглядит не так круто, а потому требует мотивировки (которая зачастую не дается, в результате студенты забивают). По аналогичной причине не нужно мотивировать классы в C++: про них еще в школьные годы так много говорят, что люди поступают уже с мыслью “вот бы заботать классы”.

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

1886 views·25 shares