Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Образование по computer science для начинающих

Есть три главные проблемы в образовании по информатике для начинающих:
-- практически не уделяется внимания образованию в части структур данных. Всё начинается алгоритмикой, и заканчивается ей. При разговорах с преподавателями какая-нибудь "структура Паскаля с пятью полями", "двумерный массив" и "магазин" -- это потолок. Объект-ориентированность идёт лесом, другие варианты жизни (функциональное программирование, multiple dispatch) идут тем же лесом.
-- вы можете заниматься два-три месяца, после чего должны ждать много лет (и программировать на одном уровне грамотности, если уж совсем невмоготу ждать и пальцы чешутся), и так будет несколько раз. Ну, или вы можете начинать сразу с восьмого класса и игнорировать более младшие возрасты, тогда всё будет более-менее непрерывно по нарастающей.
-- с выбором языка, учебников, задач и всего остального у вас будут проблемы.

Образование "сержантским методом" подразумевает решение многих мелких задач и довольно таки эффективно -- собственно, обучение физике и математике примерно так и устроено. Много мелких задач довольно легко игрофицируется. Но для этого нужно "всего ничего": online judge и последовательность задач с учебником.

Вот примерный "жизненный цикл" образования в computer science для начинающих (примерно по первый курс ВУЗа):

-- для дошкольников и начальношкольников можно использовать http://www.piktomir.ru/. Отличный и быстрый старт, правильная постановка задач, обучение именно алгоритмике. Автоматическая проверка выполнения заданий есть.
-- дальше проблема: если у вас детка, то он не знает ещё математики, а вся "школьная алгоритмика" активно использует знание математики. Вы можете, например, использовать КуМир (мой отрок прошёл этот путь летом между вторым и третьим классом), там есть набор задач, который при последовательном их предъявлении составляет вполне полноценный курс: http://server.179.ru/wiki/?page=DenisKirienko/Kumir. Этот оказывается вполне хорош, потому как КуМир уже текстовый, а не тайловый. Проблема в том, что с 14 темы там уже плавающие (которые проходят по математике только через несколько лет -- где-то в шестом классе), и дальше количество используемых знаний по математике и геометрии (исполнитель "Черепаха") стремительно нарастает. Но до пункта 13 всё можно пройти и второкласснику, проверено. И это ой-ой сколько. Вот пример реальной работы моего отрока в 2012 году (начало 3 класса): http://aalev.livejournal.com/1122.html. Альтернативы: прежде всего Scratch, и там рисовать разные мультфильмы и простейшие игры. Основная проблема: без учителя никуда, проверка заданий отсутствует.
-- тут идёт огромная пауза, поскольку дальше всё интересное начинается только с восьмого класса: курс алгоритмики на Питоне, тоже с автоматической проверкой задач -- http://informatics.mccme.ru/course/view.php?id=156. По объему он только слегка больше, чем курс на том же КуМире, но требует знания математики уровня восьмого класса. Есть видеолекции (довольно скучные) и текстовые шпаргалки. То есть это таки "дистантный курс". Дальше можно тренироваться в этой ползьбе до уровня олимпийских чемпионов (например, на ресурсе https://acmp.ru/). В принципе, такого сорта курсов для разных языков сейчас много, просто Питон представляется мне выбором получше, чем Паскаль или Си для образования по информатике. И на этом уровне можно спокойно заканчивать: вся школьная система заточена на "олимпиады по информатике", для них больше ничего не нужно знать.
-- дальше можно пытаться рассказать о собственно computer science. Если вы идёте по линии Python, то можно использовать книги со встроенной системой визуализации исполнения: по которому переделали его со Schema на Python — вот примеры книжек с исполняемыми кодами: http://interactivepython.org/courselib/static/pythond.. и http://composingprograms.com/, https://wizardforcel.gitbooks.io/sicp-in-python/conte.. (это SICP-на-Питоне). Альтернатива -- гарвардский CS50 (там не Питон, а Си и PHP, тем не менее) — https://newtonew.com/news/harvard_cs50_in_russian (оригинал https://www.edx.org/course/introduction-computer-scie..). Основная проблема всего этого счастья: нет проверки исполнения, никакого online judge. Компьютерная программа хороша тогда, когда она берёт входные данные, и выдаёт на их основе правильные выходные данные — с учётом разных граничных вариантов. При этом сами варианты обычно остаются неизвестными ученикам (в отличие от тестов, которые нужны для отладки программ, тут тестируется понимание учеников). Такие системы, например, могут сказать тебе: "программа прошла 8 из 10 тестов", но не сказать, какие были при этом входные данные — ты должен думать сам. Это даёт возможность одному учителю сработать с классом из 20 учеников, или занятому родителю с классом из одного своего отпрыска — время уходит при этом больше на объяснения и преодоление затыков, чем на рутинные проверки правильности решений. Вот этого-то и нет на этом уровне.
-- дальше идут самые разные курсы прикладные курсы: биоинформатики http://rosalind.info (с онлайн проверкой и каким-то учебником, тоже Питон), или "ноутбуки" курсов по математике (вот для примера курс современной линейной алгебры на Julia -- https://github.com/ivanslapnicar/GIAN-Applied-NLA-Course, но онлайн проверки тут нет, хотя есть assignments, то бишь задачи).

В эту экосистему прорваться не так просто. Так, вы можете решать задачи из http://informatics.mccme.ru/course/view.php?id=156 на Питоне, Си, Паскале, Руби, Джаве и даже Хаскеле. Online Judge вполне на месте, на любом из этих языков (а для некоторых языков возможно использовать и разные версии языка -- питон 2.7 и 3.5, например). Но это только один курс, перед ним и после него -- огромные дыры в части учебной инфраструктуры.

Например, что нужно сделать для использования Julia в качестве учебного языка? На нём ведь довольно много курсов численных методов (ссылки тут: http://ailev.livejournal.com/1271980.html), поэтому почему бы с него не начинать? Потому что для этого нужно было бы:
-- подправить для Julia какой-то "базовый курс" типа того же курса Кириенко для Питона для восьмиклассников. Это недолго, задачи там будут практически теми же самыми, но лекции и тексты придётся переделать, по факту написать книгу. И это совсем не похоже на текущие учебники Julia на русском (вот например, выходит через пару недель: http://dmkpress.com/catalog/computer/programming/978-5-97060-370-3/ -- но там Mastering Julia, то есть уже предполагается некоторое знание языка).
-- для Julia сделать какую-то визуализацию исполнения, как для Питона. Можно, конечно, использовать готовящийся к выходу отладчик, но вряд ли он будет удобен именно для учебных целей.
-- изготовить online judge и тестовые наборы к задачам.

Если же идти по этой линии дальше, то нужно будет:
-- переработать на Julia курс SIPC так же, как в 2010 его переделали со Schema на Python
-- сочинить какие-то задачки, которые можно проверять автоматически (что уже сомнительно)

Это всё малоподъемно. Так что текущим наиболее приспособленным для обучения computer science языком является Python -- при всех недостатках. С его использованием можно идти и дальше: в биоинформатику, в тьюториалы-ноутбуки Jupyter для deep learning, в численные методы и т.д..

Всякие же дискотеки (курсы на основе игровых движков, например подхакивание Mincraft) тут не проходят. Я уже спрашивал тут в ЖЖ совета по поводу образования в computer science, получил много советов "побольше кодировать всяких задачек, поменьше знать". Я не возражаю против программирования, программной инженерии и всего такого вокруг игр -- связь теории с практикой, конечно, важна. Но мне нужно:
-- освоение теории, не просто кодирование, а программирование с использованием теории
-- по-возможности, чтобы этот тренинг проходил без дорогого времени учители и родителя.

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

Я это обнаружил только потому, что у меня отрок потихоньку растёт, и я пытаюсь дать ему образование в computer science, причём с экономией собственных усилий. Но если бы я занимался именно образованием "как учитель", то тоже бы концентрировался
-- на подготовке к олимпиадам, ибо "все так делают", олимпиады неплохая игрофикация. Но они не требуют широкого знания computer science, метапрограммирование для олимпиад маргинально, особенности объектного и функционального программирования можно не проходить
-- одном каком-то этапе жизненного цикла ученика: "вокруг ЕГЭ" или "дошкольная информатика", или "первый курс ВУЗа". И, конечно, ни о каких связках между этими курсами, ни о каких разрывах в годах и годах между этими курсами, я бы не думал.

А если брать не computer science, а информатику в целом (http://ailev.livejournal.com/1008054.html), включая машинное обучение (это ж тоже должно входить в грамотность! это ж тоже нужно со школы учить!), и добавить сюда системный подход и азы системной информатики (http://ailev.livejournal.com/1272169.html, http://ailev.livejournal.com/1273208.html, http://ailev.livejournal.com/1274210.html), то всё становится ещё хуже и неподъемней. "Компьютерной грамотности" сегодня обучают из рук вон плохо, обрывочно и это обучение очень плохо поддержано технологически. У восьми нянек жизненный цикл такого обучения получается без глазу, носу, зубов и почти всего остального.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 22 comments