Dyzzet|
C++ Data Science Алгоритмы Темы · Блог · YouTube
Анализируем курс «Яндекса» по языку C++

C++ Russia 2018: Илья Шишков. Как научить языку C++: опыт создания курсов на Coursera (Youtube)

Teaching by making people uncomfortable. Kate Gregory’s Blog

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

Сегодня посмотрим выступление Ильи Шишкова (старший разработчик отдела безопасного поиска компании «Яндекс») на конференции C++ Russia 2018. Проанализируем вопрос в целом и это выступление в частности с точки зрения андрагогики (дисциплины, чей предмет — то, как нужно учить взрослых людей) и дидактики (теории обучения — такая дисциплина, которая занимается вопросами «Зачем, чему и как учить?»).

* * *

На курсе пять «поясов»: белый, жёлтый, красный, коричневый, чёрный. Заявленные цели: научить «самостоятельно решать практические задачи на языке C++», применять естественные идиомы и конструкции, самостоятельно находить ответы и изучать язык глубже; писать эффективный код без ущерба для качества.

Из выступления: «Чтобы они знали, какие есть источники информации, знали ключевые слова и могли, грубо говоря, нагуглить ответ на свой вопрос. Ой, меня просили не говорить слово „нагуглить“. Поискать в „Яндексе“».

Заявляется, что в основу «массового онлайн-курса, который будут смотреть тысячи людей», заложены работы мэтров (Страуструп, Майерс, Саттер, Александреску). Так выглядел учебный план до того, как они узнали о Кейт Грегори, которая открыто говорит, что готовит лишь пользователей библиотек, то есть людей без глубокого понимания предмета.

 
Белый пояс
Жёлтый пояс
Красный пояс
1
Пространства имён. Указатели, ссылки. Порядок вычисления аргументов функций
Исключения. Гарантии при работе с исключениями. RAII
string, string_view
2
Создание классов: конструкторы, деструкторы, поля, методы
pair, tuple, array, vector. Категории итераторов
Способы захвата переменных в лямбдах. std::function
3
Перегрузка функций. Перегрузка операторов
deque, list, map, set
Частичная специализация шаблонов. Variadic templates
4
Создание шаблонов. auto
<algorithm>. Лямбды
<sstream>, <fstream>, unique_ptr, shared_ptr

Когда они узнали о Кейт Грегори, вдохновились, избавились от всех наработок и начали заново.

«Из-за этого — из-за такого подхода, когда мы вначале концентрируемся на не самых тривиальных вещах — у людей возникает ощущение: „Ребята, мне в первый день рассказали про арифметику указателей. Я ничего не понял. Что же будет дальше? На второй день? На третий? Нет, C++ — это слишком сложно для меня, я не буду его учить“. И уходит».

И правда странно, что нет многих важных базовых тем, а те, что есть, идут в непонятном порядке. Авторы признаются, что каждая тема с самого начала разбиралась в деталях, map «всплывал» поздно, потому что это шаблон класса, а шаблоны якобы требуют обстоятельного изучения.

На красной плашке на слайде № 14 возле map написано:

«Мы собираемся рассказать людям про map на седьмой неделе изучения C++! Какой питонист будет проходить наш курс, если у нас словарь всплывает через полтора месяца?»

И вообще «изучавшим» язык Python почему-то уделяется так много внимания:

«А теперь давайте вспомним, как учат людей языку Питон. Там прям сразу говорят: „Вот, ребят, смотрите, у нас в Питоне есть списки. Смотрите, как ими легко пользоваться! А ещё есть словарь. Там фигурная скобка — открыли, ключ, значение, закрыли. Очень легко!“ Это люди, изучающие Питон, проходят в первые два часа. И вот к нам приходит питонист, который в вузе изучил Питон, теперь он хочет освоить C++. Он смотрит: „Ничего себе, ребята! Вы мой словарь любимый аж на седьмой неделе рассказываете. Я что-то не хочу у вас учиться: сложно“».

Вот что получилось «после перезагрузки».

 
Белый пояс
Жёлтый пояс
Красный пояс
Коричневый пояс
1
Обзор возможностей C++. Тестирование и отладка. if, for, while
Целые типы. pair и tuple. Шаблоны функций
Введение в макросы. Шаблоны классов. Принципы оптимизации
Устройство ассоциативных контейнеров
2
Функции, ссылки, const, vector, map, set
Юнит-тестирование
Сложность алгоритмов. Модель памяти
Пространства имён. «Умные указатели». Владение
3
sort, count, count_if. Лямбды. Пользовательские типы
Многофайловые проекты. ODR
Move-семантика
RAII. Exception safety
4
<fstream>. Перегрузка операторов. Исключения
Итераторы. <algorithm>, deque, queue
Устройство линейных контейнеров
const correctness. Compile time vs. runtime
5
Финальный проект
Наследование. Полиморфизм
Введение в многопоточность
Финальный проект
6
 
Финальный проект
Финальный проект
 

Какие-то вещи действительно стали лучше:

«Не надо знать про шаблоны, чтобы пользоваться вектором».

«Проблема: как одновременно избежать лишнего копирования, избежать случайного изменения параметра функции, разрешить принимать в функцию временные объекты?» (использовать константную ссылку).

void PrintSize(const vector<Person>& people) {
  cout << people.size() << endl;
}
int main()  {
 
  PrintSize(vector<Person>(15'000'000));
}

Что-то ошибочно:

«Слово „указатель“ впервые появляется в середине третьего курса. Потому что вам не надо уметь работать с указателями, чтобы программировать на современном C++» (на слайдах это «Модель памяти»).

Хоть и говорится, что в основу положены «принципы: понятность вместо полноты, демонстрация проблемы, наглядность», это выглядит как случайный набор красивых слов. Современная дидактика предлагает множество принципов, в том числе, скажем, не только действия со стороны преподавателя, но и собственную инициативу того, кто учится. Где место этому в курсе — не понятно. А ведь в андрагогике особо важными считаются осознанность и главная роль у того, кто учится.

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

20:56

using namespace std

Чтобы показать, как важно учить постепенно, шаг за шагом, спикер переливает какую-то жидкость из одной бутылки в другую — тоже постепенно. А затем делает то же самое быстро, так что часть жидкости в бутылку не попадает. Уровень дискуссии об одном из самых сложных языков.

В наших курсах

  • Мы не затрагиваем скорость работы программ до третьего курса
  • Используем using namespace std до четвёртого курса даже в заголовочных файлах
  • ...

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

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

Слайд № 31:

  • Научили писать функции
  • Объяснили, что параметры передаются по значению
  • Проблема: как написать функцию swap(x, y)?
  • Решение — принимать по ссылке

Решение — принимать по указателю, конечно. А уже затем показать ссылки.

Целочисленные типы изучаются только на втором курсе (что не очень поздно, но и не рано). Проблема кроется в том, что преподаватели должны аккуратно объяснить, зачем нужен каждый тип. Базовые типы вообще — это то, что используется довольно часто, вот почему это важно и часто идёт в начале.

«Вот пришёл вот это вот изучать человек, который знает Питон, в котором есть один целочисленный тип, который никогда не переполняется. Он смотрит на это всё такой: „Что? char — целочисленный тип? (в зале заметили, что в языке Пайтон есть только строки. — Прим. DZ.) Это не опечатка, нет?“ Или: „Ой, а что это за сложные такие числа, вот это: 2147... и так далее. Что, надо зазубрить, да? Их точно надо помнить?..” И он не понял».

Из ответов на вопросы мы узнаём, что задания проверяются автоматически, стиль никак не проверяется, внимание на этом не заостряют.

Хотя и заявлялась цель научить «самостоятельно находить ответы», не видно, как эта самостоятельность прививается, как к этому мотивируют (как вообще изучают мотивы слушателей).

Если судить по выступлению, используются только видеолекции и задачи — 48 на первом курсе, 33 на втором и 35 на третьем (то есть объяснительно-иллюстративный и репродуктивный методы). Задачи со сложными ситуациями, специфическими идиомами (скажем, перегруженные константный и неконстантный методы без дублирования кода) и задачи исследовательского характера остаются за бортом; такие методы трудно применять, когда курс массовый. Но остаются вопросы. Как можно изучать столь огромный язык без решения сложных ситуаций и самостоятельных поисков? Зачем нужен массовый курс по такой специальной дисциплине? Больше того, задачи, которые обычно решают на C++, связаны с другими сложными дисциплинами (сетевое приложение — компьютерные сети, часто это базы данных, графика — соответствующая математика и т. д.). Андрагогика отдаёт приоритет комплексным (междисциплинарным) занятиям. Нет ответа на вопрос, насколько человек будет готов хоть к чему-то. Много говорится о содержании, но совсем мало — о том, как будут учить, а анализ результата проводится по большей части автоматически.

У курса высокие оценки на платформе Coursera (белый пояс — 4,8/5, жёлтый пояс — 4,95/5), авторы говорят, что «слушателям нравится».

Отзывы на белый пояс:

«Этот курс показал мне нормальный C++, а не тот, которому меня учили в университете».

«Как же у меня отлегло от сердца, когда понял, что C++ — язык очень даже высокого уровня!»

«Вы сделали курс настолько понятным, что даже семиклассница смогла его пройти. Благодаря вам я сделала первый шаг к своей мечте!»

Как я подружил науку и разработку на С++ — блог «Яндекс Практикума»

Относиться к таким отзывам нужно с осторожностью, поскольку в интернете регулярно появляются посты, где простые люди хвалят курсы. Порой они написаны прямо в блоге компании. Как, например, пост кандидата химических наук, который теперь «сочетает науку и разработку на C++» (в этом посте есть ссылка с ключом utm_campaign=pr_content_cpp_tproger). Но химики и не такое могут, мы смотрели «Во все тяжкие».

* * *

Зачем нужен массовый курс? Просто чтобы больше людей могли платить за него?

Зачем ориентироваться на «питонистов»? Ответ, наверное, не в дидактике, а в рекламе. Даже названия этапов — пояса — это рекламный ход. Удержать кошелёчек.

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

11 июня 2022
C++
Зарегистрируйтесь и войдите, чтобы оставлять комментарии и голосовать.

Как учить C++
Нужно ли учить C перед C++
Анализируем курс «Яндекса» по языку C++
Также может быть интересным
© MMXI—MMXXIII. RSS. Поддержать сайт
Светлая тема / тёмная тема