?

Log in

 

Почему Python должен быть первым языком программирования в школе? - Денис Кириенко

About Почему Python должен быть первым языком программирования в школе?

Previous Entry Почему Python должен быть первым языком программирования в школе? 23 ноя, 2014 @ 13:41
Сегодня писал ответ Нине Шумилиной из Твери, на вопрос о Python, как первом языке программирования в школе.

Она цитировала Константина Полякова, заключение его статьи в сентябрьском номере "Информатики":
По этим причинам автор склонен поддержать мнение И.А. Сукина: Python хорош для профессиональных программистов, но его использование в качестве первого языка программирования может быть неудачным решением. Как признаются учителя, преподающие на Python, те, кто учился программировать на Python, не хотят переходить на другие (более низкоуровневые) языки. Научив школьников сортировать массивы вызовом метода sort, сложно потом объяснить, зачем написаны целые тома об алгоритмах сортировки. А это может привести к появлению плеяды “программистов-только-на-Python”, не готовых к преодолению дополнительных ограничений ради повышения эффективности программы. Фактически учитель попадает в ситуацию, которая хорошо описывается фразой “В Python такие возможности есть, но учить так нельзя!” (Е.В. Андреева). В то же время, было бы полезным изучение Python в качестве второго языка программирования в классах с углубленным уровнем изучения информатики (например, после Паскаля или C).

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

Несомнено, отношение к Python разное. Действительно, высказываются опасения, что динамическая типизация и слишком большая "высокоуровневость" языка вредна для обучения, что нельзя подменять понятие "массив" высокоуровневыми списками, так как "обманутые" легкостью операций со списками школьники не будут понимать принципов внутренней организации и т.д.

Но на мой взгляд подобная критика исходит в основном от "теоретиков", которые ни разу не пробовали учить программированию именно на Python, то же Поляков хотя и начал публиковать в "Информатике" статьи про Python, но, похоже, никогда его не использовал для обучения. А вот критикующих Python практиков, то есть людей, которые попробовали бы учить детей на Python хотя бы год, а потом бы отказался, мне неизвестно.

Например, якобы процитированная Поляковым Е.В.Андреева три года назад решила попробовать учить школьников 6-7 класса в "Интеллектуале" на Python. До этого относилась к этой затее довольно скептически, но решила попробовать. Через полгода она уже выступала на конференциях и говорила, что школьников в среднем звене лучше всего учить на Python, что она в это не очень верила, но вот попробовала и за несколько месяцев её взгляды переменились. Так что не знаю, что именно цитировал Поляков и сколько лет этой цитате, но вот вчера я специально показал эту переписку Андреевой и попросил ответить, на что она написала "Ответ Шумилиной - школьников среднего звена безусловно надо учить на Python".

В чем достоинства Python? Не только в простоте языка, но и в том, что это - огромный, многогранный, разносторонний мир программирования. В этом мире легко начать программировать, и достоинства Python, как первого языка программирования, кажется, обсуждать смысла нет - ничего проще явно не существует (из языков программирования общего назначения). Он гораздо лаконичней Pascal и программирование на нём лишено необходимости возни с большим количеством технических вещей, что трудно для совсем начинающих. Гораздо проще писать программы начинающим, если они состоят из пяти строчек, а не из пятнадцати, алгоритмы они реализуют те же, а вот времени на написание и отладку кода уходит меньше, а, значит, и больше задач можно решить, и дальше продвинуться, и для работы с массивом ну куда удобней написать:

a = [0] * 1000
чем
var a: array[1...1000] of integer;
...
for i := 1 to 1000 do
  a[i] := 0;

Результат для программиста - одинаковый, получается массив, заполненный нулями, но на Python - одна строка вместо трех, а смысл не меняется. И тут скептики, конечно, будут говорить, что вот нельзя так писать, как на Python, что школьник должен понимать, что массив - это непрерывный фрагмент памяти, что мы должны должны его объявить, то есть зарезервировать для него место, что мы должны его проинициализировать, заполнив его нулями... Ну а наш ответ скептикам - это то, смысл для начинающего программиста не меняется, наоборот, строка a = [0] * 1000 лучше отражает то, что школьник хочет получить и сразу же (хочу список из одного числа 0, повторенного 1000 раз), гораздо проще пишется и позволяет решить больше задач!

Просто посмотрите на два приведенных выше фрагмента, какой из них понятней? Какой из них Вам нравится больше?

Итак, для начинающих, несомненно, лучше Python. Причем слабые дети могут здесь и остановиться, получив общее представление о программировании. А вот сильные школьники могут двигаться дальше, и в их распоряжении будет современный универсальный язык программирования, реально используемый для разработки программного обеспечения в ведущих мировых компаниях. Вот, например, статистика - "На чем пишут в Яндекс": http://blog.yandex.ru/post/77617/. На Python можно писать веб-сайты, компьютерные игры, GUI, клиент-серверные приложения, ну то есть всё, что угодно.

Теперь относительно высказывания, что в языке много высокоуровневых вещей, и возникает соблазн их использовать, вместо того, чтобы изучать, как это устроено. Ну так это проблема - методическая, а не проблема языка программирования. Общий методический подход здесь такой - сначала мы понимаем, как это работает, потом разрешается использовать соответствующий элемент языка. Например, сначала написали обмен значений двух переменных через вспомогательную переменную, потом я показываю, как это делается при помощи кортежей (a, b) = (b, a). Сначала написали максимум из двух, трёх чисел, потом можно использовать функцию max. Потом написали программу поиска максимума в
последовательности (массиве), после этого можно использовать функцию max для списка. Сначала написали сортировки сами, потом можно пользоваться функцией sort, и я даже настаивают на том, чтобы школьники пользовались стандартной функцией sort - это быстрее и удобней, и позволяет решить больше задач, но только после того, как они научились сами писать sort.

На самом деле, встроенная сортировка есть в любом современном языке программирования (Java, C++, PHP), ибо сейчас так принято. Нет её только в классическом Pascal (а вот в современном Delphi - есть), нет в старых бейсиках (а в Visual Basic - есть), но это же не означает, что всеми этими языками нельзя пользоваться, ибо в них есть встроенная сортировка? И никому же в голову не придет запрещать изучение этих языков в школе только потому, что "а вдруг учитель научит детей пользоваться встроенной сортировкой, а потом этим детям не объяснишь, зачем нужно изучать сложности алгоритмов сортировки". Поэтому проблема не в том, если в языке программирования sort или нет, а проблема в том, КАК этим пользоваться. Каким-то школьникам достаточно объяснить, что такое "сортировка выбором" - она понятна и очень легко пишется на том же Python, а с кем-то можно обсуждать и эффективные алгоритмы сортировки, и наличие встроенной сортировки этому не мешает. Более того, если я детей учу программированию на том же C++, то я стараюсь научить детей и пользоваться сортировкой sort из STL, причем эффективно её использовать, и это не мешает изучению алгоритмов сортировки. В MIT (Massachusetts Institute of Technology) все начальные курсы программирования несколько лет назад перевели на Python. На новом факультете компьютерных наук ГУ ВШЭ, созданном в 2014 году при участии компании "Яндекс", именно Python является первым языком программирования, который изучают студенты. Здесь я привожу именно новый факультет как пример, т.к. в вузах с уже сложившимися программами труднее что-либо поменять, например, на факультете ВМК МГУ попытка заменить Pascal на C, как первый язык программирования, оказалась безуспешной ввиду нежелания изменять сложившиеся программы и контингент преподавателей.

Дальше посмотрим на высказывание "А это может привести к появлению плеяды “программистов-только-на-Python”, не готовых к преодолению дополнительных ограничений ради повышения эффективности программы.". В каком-то смысле, ничего плохого в этом нет. Программирование становится всё более и более массовой профессией, и многие навыки программиста не относятся к тому, что является высшим образованием, то есть большинству программистов и не нужно изучать тома, посвященные алгоритмам сортировки. Сложности алгоритмов сортировки - это уже, несомненно, сфера высшего профессионального образования, ну а программисты, умеющие написать сайт на PHP или программу для бухучета
в 1С тоже нужны, и их нужно очень много. Таким программистам в целом необязательно разбираться в алгоритмах сортировки, им как раз необходимо уметь пользоваться стандартной функцией sort для любых задачи и знать, что она умеет сортировать массивы лучше, чем если бы они это написали самостоятельно (и уж совсем странно требовать от web-программиста знания алгоритмов быстрой сортировки, конечно, ничего плохого не будет в этом знании, но для работы ему это совершенно ненужно). Так что система обучения программистов должна включать в себя и среднее профессиональное образование (на котором учат прикладным вещам и технологиями), и систему высшего образования (где как раз уместно обсуждать вопросы сложности алгоритмов сортировки), точно так же, как это есть во многих отраслях, например, в медицине (медик со средним специальным образованием выполняет стандартные медицинские процедуры, а медик с высшим образованием умеет назначать лечение, то есть анализировать причины и принимать решение). Да, специальности, связанные с программированием есть и в среднем специальном образовании, и в высшем образовании, но система здесь не так выстроена, как в той же системе медицинкого образования. И, если честно, я плохо представляю, что происходит в среднем профессиональном образовании с обучением программированию.

Одна из аналогий, которую я люблю здесь приводить - это прогресс в распространении автомобилей. В начале и середине XX века водитель автомобиля должен был знать устройство автомобиля и сам производить довольно сложный ремонт. Любой водитель должен быть в значительной степени механиком. Сейчас многие водители ну если и имеют общее
представление об устройстве автомобиля, то уж точно никогда не занимаются его ремонтом, предпочитая выполнять всё техническое обслуживание в автосервисе. Хорошо это или плохо? Это, на мой взгляд, неизбежно. Широта распространения автомобилей стала такой, что сложно требовать от всех автолюбителей навыков ремонта и глубокого познания устройства автомобиля. Широкое распространение автомобиля неизбежно приведет к тому, что у большинства водителей не будет глубоких познаний об устройстве автомобиля. А автомобили, в свою очередь, становятся удобней и надежней, поэтому использовать их можно и без специальных навыков.

Точно так же и с программированием - программирование становится все более распространенным, а сами языки программирования - все более удобными и простыми. Несомненно, количество программистов растёт и будет расти (хотя всё равно в отрасли огромная нехватка квалифицированных программистов), при этом уровень глубокого понимания вещей будет снижаться. Это неизбежно, но это не повод отказываться от современных высокоуровневых языков программирования, точно так же, как и не никому в голову не придет отказываться от современных автомобилей только потому, что они надежней и удобней, и не требуют специальных познаний для постоянного использования.
(Оставить комментарий) Страница 1 из 2 - [1] [2]
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 10:48 (UTC)
(Link)
От Андрея Станкевича (чтобы не забыть):

В целом же все так. и да, у сильных школьников, обученных на питоне, есть трудный период в несколько недель-месяцев, когда им приходится осознавать ограничения питона и осваивать новый язык, но потом, когда они владеют и тем и другим, у них преимущество и в простых задачах (быстро написать на питоне) и сложные они могут написать.
[User Picture Icon]
From:tigvarts
Date:Ноябрь, 23, 2014 12:04 (UTC)
(Link)
Небольшое уточнение про ВМК: у 1/3 курса первым языком всё-таки сделали С.
From:(Anonymous)
Date:Ноябрь, 23, 2014 12:21 (UTC)

Вл. Ильин

(Link)
Я думаю, вполне можно продолжить мысль автора так:
Технологии развиваются стремительно, и сейчас уже мы живем в мире, где не только не нужно изучать программирование серьезно, "на машинном уровне" его не надо изучать вообще. Это становится уделом профессионалов, а школа должна давать именно общее образование. Уже давно для того, чтобы решить задачи на компьютере можно решить без программирования. Для большинства задач сейчас необходимо владение разнообразными тонкостями уже написанных программ. Часто обработку данных гораздо удобнее сделать в электронных таблицах, например, чем писать даже очень простой скрипт. Так что программирование скоро просто должно покинуть школьную программу.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 12:30 (UTC)

Re: Вл. Ильин

(Link)
Ну если ты так думаешь, то и продолжай. А я так не думаю. И прочти в середине текста замечание про методические проблемы.
[User Picture Icon]
From:smenavech
Date:Ноябрь, 23, 2014 12:34 (UTC)
(Link)
мне кажется, сначала надо определить, что это значит - научить человека программировать. Если ставить задачу просто научить человека писать код, который был бы в состоянии вывести, скажем, круг на экран, то, возможно, язык программирования будет достаточно важен.

Язык был бы не столь важен, если на выходе хотеть получить человека, который бы в задаче выведения круга на экран видел бы , например, что эта задача мало отличается от выведения круга на принтер и надо разделить задачу собственно визуализации образа и составления этого образа (возможно, пример недостаточно удачен). По моему представнению хорошего программиста от плохого отличает наличие "архитектурного" мышления, а для обучения такому мышлению практически неважно, какой из обьектоориентированных языков использовать.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 12:59 (UTC)
(Link)
Ну я как бы веду речь о программировании в школе. Оно, конечно, тоже разное бывает - одним школьникам нужно показать, что есть такая сфера деятельности, как программирование, и что компьютер как раз управляется такими программами, ну и простые алгоритмы научиться писать. Это вот должно быть в базовом курсе.

А вот содержание профильного курса оно, действительно, непонятное даже на школьном уровне.
[User Picture Icon]
From:8kap8
Date:Ноябрь, 23, 2014 12:40 (UTC)
(Link)
Я еще добавлю вот какую мысль. Когда-то программированию учили на ассемблере (или даже в машинных кодах), и, когда появились языки высокого уровня, тоже наверняка были большие дебаты на тему того, можно ли начинать обучение программированию с языка высокого уровня, или надо обязательно учить ассемблер. Аналогичная проблема наверняка появлялась и во многих более мелких ситуациях (можно ли учить работе с файлами через стандартные функции, или надо досконально понимать, что происходит на низком уровне?) Поэтому вопрос с питоном — это, на мой взгляд, просто развитие этой же темы.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 13:06 (UTC)
(Link)
Петя, это у меня в планах, этот кусок я не дописал. По этому поводу у меня есть замечательные цитаты - предисловие Кнута к "Искусству программирования", где он 50 лет назад рассуждает, на каком языке ему приводить примеры - на машинном или на "алгебраическом", под "алгебраическими" он подразумевает Fortran или Cobol. И останавливается на машинном языке, который сам же и придумывает. Его аргументы:

1. "Алгебраические" языки приходят и уходят, мода на очередной "алгебраический" язык продолжается лет пять. А я тут о вечных ценностях собираюсь писать...

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

И в результате через 50 лет примеры кода у Кнута читать невозможно. Это самый большой недостаток "Искусства программирования" - примеры на машинном коде. С другой стороны, если бы он писал примеры на Fortran или Cobol, то результат был бы не лучше.

Поэтому в томе 4A, например, он уже примеры программ пишет просто на "естественном" языке.

Я про это планирую написать, когда займусь доработкой статьи.

Edited at 2014-11-23 13:09 (UTC)
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 13:27 (UTC)
(Link)
Еще был вопрос про "линейку языков программирования". По-видимому, "линейка" в моём представлении такая, с примерным обозначением классов учащихся, для средней школы.

1. 0-4 класс. Пиктомир (http://www.piktomir.ru/) - программирование простого исполнителя в форме программы, собираемой из визуальных образов.

2. 3-5 класс. Скретч. http://scratch.mit.edu/

3. 5-6 класс. Исполнитель "Черепашка" (например, в Кумире, Лого и т.д.)

4. 6-7 класс. Исполнитель "Робот" в Кумире.

5. 7-9 класс. Python.

6. 10-11 класс, профильный уровень. Python, C++, Java, C# - на выбор.

Линейка примерная, понятно, что какие-то этапы могут пропускаться (да и нет у нас в школе обязательной информатики до 8 класса), какие-то этапы можно двигать. В старшей школе может быть выбор - либо писать на Python дальше, как я сейчас делаю (сейчас я беру школьников в 9 классе и до 11 класса учу их только на Python, не считая олимпиадников), либо изучать какой-либо другой язык программирования, тот же C++ для "низкоуровневого понимания". Но я вот не очень понимаю, зачем в школе изучать что-либо после Python (если не касаться олимпиад, это отдельная тема), вот и не даю уже ничего, кроме Python старшеклассникам.
From:haw_linux
Date:Ноябрь, 25, 2014 12:51 (UTC)
(Link)
pyturtle
pygame
From:(Anonymous)
Date:Ноябрь, 23, 2014 14:20 (UTC)
(Link)
А можете ли хоть чего-нибудь посоветовать из более-менее внятных (пусть не утверждённых официально и может даже не совсем дописанных, но доступных) учебников, где программирование от самых-самых основ и на Питоне?

Роман Сузи -- само собой, но это всё же никак не единственный учебник для тех, кому надо от самых-самых основ.

Если и впрямь что-то есть -- думаю, указать и проанализировать было бы очень полезно и для статьи, и для обращения людей (учителей) в свою веру.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 14:32 (UTC)
(Link)
Да, мой курс: http://informatics.mccme.ru/course/view.php?id=156

Правда, там тексты не годятся для учебника, то есть они не самодостаточны, а скорее являются конспектом к занятиям. Зато там есть мои видеолекции. И задачи для решения с тестирующей системой.
[User Picture Icon]
From:prijutme4ty
Date:Ноябрь, 23, 2014 14:44 (UTC)
(Link)
В целом, пожалуй, согласен. Я сам правда учил детей на руби.
Мне, однако, кажется, что лучше учить после питона что-нибудь более близкое к железу, лучше - C. Так чтобы школьник и умел что-то делать, и понимал, как это работает. Чтобы ученик массивы повыделял на стеке, и поудалял двухмерные массивы из кучи, попередавал значения в swap, упоролся о сигнатуры, поучился передавать пары значений и error-коды как результат функции.
Без этого когда он встретит серьезные проблемы, он даже не поймет в чем дело. Хуже, никто не сможет ему объяснить, поскольку они говорить на одном языке не могут. Кучи какие-то, сборка мусора, error-коды, интерфейсы.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 15:28 (UTC)
(Link)
В моём представлении, вот эти вещи - стек и куча, выделение памяти и т.д. - это уже тема для высшего профессионального образования. И в курсе высшего образования это должно быть, в моём списке языков для высшего образования есть C и Ассемблер, причем С именно как язык системного программирования. И даже не для среднего профессионального образования, где можно ограничиваться прикладными вещами, типа web-программирования, баз данных или 1С.

В школе это можно изучать, но только в профильной программе, и то если профиль соответствующий, а школа - сильная, или в виде спецкурса. Но, думаю, число школ, где можно такие курсы вести - единично.
[User Picture Icon]
From:iscremas
Date:Ноябрь, 23, 2014 16:00 (UTC)
(Link)
Я тут недавно где-то на просторах встретил замечание, которое поддерживаю чуть более чем полностью: "Всё чему учат на курсах программирования - это в лучшем случае алгоритмы. Про то, как писать программы, никто не учит."
Не уверен, имеет ли смысл учить этому именно школьников, но я абсолютно уверен, что сейчас по факту этому не учат нигде, даже в лучших ВУЗах, а тема более чем актуальна для людей, стремящихся стать профессионалами, или же просто программировать реальные приложения.
Постоянно сталкиваюсь с тем, что приходят на работу даже "опытные программисты" и не знают ни шаблонов проектирования, ни принципов дизайна классов, наступают вновь из раза в раз на одни и те же грабли. И от языка это знание не зависит вообще почти никак...
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 16:16 (UTC)
(Link)
Это верное замечание, и про вузы тоже верное замечание. Хотя где-то в вузах есть курсы, посвященные проектированию и дизайну классов.

Что до того, как учить "писать программы". Мне кажется, что я умею учить писать программы - на простом, школьном уровне. Сейчас я зачастую стараюсь добиваться от школьников, чтобы к их коду нельзя было придраться - то есть я сам придираюсь к коду до тех пор, пока не получится хороший код. Конечно, это не проектирование классов, это маленькие учебные программы, но я слышал отзывы от преподавателей летней компьютерной школы, что школьники 179 школы отличаются тем, что они умеют писать ХОРОШО.

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

Эх, планы, планы...
gbnjy - (Анонимно) Развернуть
From:(Anonymous)
Date:Ноябрь, 23, 2014 17:32 (UTC)
(Link)
Пример, на мой взгляд, не очень удачный, ибо [0] * 1000 это не шибко наглядный синтакс задания массива. Наверняка можно подобрать куда более красивые примеры для иллюстрации, в целом, той же мысли. Хотя бы что-нибудь в духе max(a) или a[x:y], а то и dict.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 17:50 (UTC)
(Link)
У меня нет цели продемонстрировать всю мощь языка и как легко и просто на нём можно писать. А есть цель показать различия в подходах - кому нравится объявлять массив вот так по-паскалевски, а кому нравится, как в Python. По-Паскалевские (или в стиле Си) - это предварительное объявление, статическая типизация, потом - заполнение циклом. Ну а в Python я написал как. И критика в адрес Python как раз в том, что используя вот такие высокоуровневые списки школьник не будет понимать, что такое массив, что это - непрерывная область памяти, которую нужно выделить, которую нужно заполнить нулями и т.д. А я показываю, что мне это не нужно.

Остальные ваши примеры неудачны.

Если написать max(a) - то это как раз предмет критики, будут говорить "так нельзя учить". Поэтому этот момент мы обсудим дальше.

Срезы - непонятное понятие, нужно объяснять, что это такое.

Словари - это, конечно, круто, но это бой совсем в разных весовых категориях. То, что в Python есть словари, а в Pascal - нет, это и так понятно, но это совсем о другом.
From:geometer
Date:Ноябрь, 23, 2014 18:25 (UTC)
(Link)
Всё так, но мне кажется, не затронут один аспект проблемы. Python -- язык, по сравнению с более традиционными Pascal/C/C++/Java, фактически без строгого синтаксиса. В том смысле, что в нём столько синтаксического сахара (и столько нелогичностей), что любое рассказанное школьникам подмножество тут же очевидно обнаруживает свою неполноту. Складывается ощущение, что писать можно "как угодно, лишь бы было правдоподобно".

Это затрудняет объяснение проблем, когда они таки возникают. Почему можно написать print без скобочек, а другую функцию нельзя? Почему (1,2) и (1, 2,) -- это синонимы, а вот различать (1) и (1,) нужно в обязательном порядке? А [1] и [1,] опять синонимы?

Проблема "это нельзя понять, это нужно просто запомнить" переносится из самого начала (где она расположена в Pascal/C) в то место, где хочется уже ожидать, что теперь всё идёт логично.

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

Ну и до кучи возникает проблема квалификации преподавателя. Он должен знать множество тонкостей (куда больше, чем для Pascal/C), и уметь разбираться в новых проблемах.

Мораль, на мой взгляд, такая. Если есть сильный учитель (который и язык сам понимает, и объяснить может не от сих до сих, и легко разбирается с проблемами, которых сам раньше не встречал) + более или менее сильные школьники, тогда, действительно, python на сегодня один из лучших вариантов. Но говорить что python -- выход для массового обучения (а именно такой вывод вроде как делается в основном тексте), я бы поостерёгся.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 23, 2014 18:54 (UTC)
(Link)
Я не хочу обсуждать другие языки программирования и сравнивать какие-то конкретные языки программирования, их логичности и нелогичности. Python мне кажется логичным языком и особых проблем с нелогичностью я в нем не вижу, по крайней мере на школьном уровне. И, разумеется, нужно использовать Python версии 3, по крайней мере не будет проблем с тем, что print - это не функция, и пишется без скобочек, ну и вообще многие другие нелогичности исправлены (как, например, огромная нелогичность языка C - смысл операции "/" зависит от типа операндов).

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

Я учил детей на C++ и учил детей на Python. Учил ну в общем одинаково - одинаковые задачи, одинаковые подходы. По моим ощущениям уровень вхождения в Python гораздо ниже, чем в C++, и подводных камней гораздо меньше. В C++ можно забыть проинциализировать переменную, выйти за границу списка, написать if (a = b), поставить точку с запятой после for (i = 0; i < N; ++i); и после этого часами искать ошибку. В Python подобных граблей гораздо меньше, ибо язык разрабатывался на 20 лет позднее, чем C.

И квалификация преподавателя в языке C/C++ на самом деле нужна гораздо выше - как объяснить, почему if (a = b) - работает, но не так, а почему if (0 <= x <= 10) тоже работает, но тоже совсем не так? Можно привести массу примеров. Вот последний пример, нашел две недели назад:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    if (sqrt(2) == sqrt(2))
        cout << "Equal" << endl;
    else
        cout << "Unequal" << endl;
}


Почему этот код может выводить Unequal в некоторых случаях? (попробуйте скомпилировать при помощи gcc на 32-битной системе, может быть получится воспроизвести). Какое количество преподавателей да не то, чтобы школы, а даже вузов России сможет это объяснить? А что будет делать учитель в школе, если столкнется с такой проблемой? Я вот, например, на stackoverflow писал вопрос...

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



Edited at 2014-11-23 19:03 (UTC)
[User Picture Icon]
From:Daniil Ayzenshteyn
Date:Ноябрь, 23, 2014 18:31 (UTC)
(Link)
Честно скажу, не знаю питона, хотя руки давно чешутся уже, напишу по опыту других высокоуровневых языков.
Конечно, писать программы лучше с использованием наиболее высокоуровневых возможностей из предоставляемых языком и платформой. Но всегда важно знать их ограничения. Ибо рано или поздно придётся продукт масштабировать, и вот тут непонимание того, что стоит за тем или иным синтаксическим сахаром может выйти боком. Не стоит уповать на то, что большая часть этих школьников будут писать нечувствительные к производительности компоненты для бизнес-задач. Нет, они будут писать всю эту "бизнес-лапшу", но только не в первом, дак в пятом проекте придётся её оптимизировать. И оптимизировать в том числе выбрасыванием сахара.
В целом, это конечно, тоже методологическая проблема - как объяснить школьникам, что подход "понимаю то, что применяю" нужно применять не только к циклам и сортировке, но и к любой другой новой фиче языка. Думаю, что она решаема, но эта проблема новая - её не было при переходе к высокоуровневым языкам после низкоуровневых.
[User Picture Icon]
From:bljakhin_mukher
Date:Ноябрь, 23, 2014 22:04 (UTC)
(Link)
Думаю, что она решаема, но эта проблема новая - её не было при переходе к высокоуровневым языкам после низкоуровневых.

Именно! Меня наверное закидают тапками, но мне кажется для обучения профессиональному программированию хорошим вариантом было бы предварять работу на высокоуровневом языке работой на низкоуровневом. Если же речь идет только об ознакомлении, то в зависимости от самых разных факторов где-то паскаль предпочтительней где-то питон, где-то Си. Только не объектно ориентированные языки.
[User Picture Icon]
From:cema
Date:Ноябрь, 23, 2014 21:12 (UTC)
(Link)
на факультете ВМК МГУ попытка заменить Pascal на C, как первый язык программирования, оказалась безуспешной ввиду нежелания изменять сложившиеся программы и контингент преподавателей.

Боже мой, неужели это правда? Я давно слышал, что ВМК гадюшник тот еще, но всегда считал, что хотя бы специалисты там приличные.

Edited at 2014-11-23 21:12 (UTC)
[User Picture Icon]
From:cross_join
Date:Ноябрь, 23, 2014 21:58 (UTC)
(Link)
Если цель программирования "копай больше - кидай дальше", то можно делать упор на минимизации количества вбиваемых с клавиатуры символов.
Можно показать студентам, что на Паскале легко определить функцию заполнения любого массива. Следующий вопрос - заполнение любыми объектами, по идее должен вызвать дискуссию о строгой и нестрогой типизации.

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

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

Edited at 2014-11-24 08:44 (UTC)
From:saylars
Date:Ноябрь, 23, 2014 23:30 (UTC)
(Link)
А имеются уже школьники, которые начинали с Питона, а успешно изучали С+асм и вообще лезли в эту низкоуровневость дабы понять, как это все на самом деле работает. Просто вот за эту связку я очень благодарен ВМК, это было и интересно, и полезно.

И существует ли проблема с вопросом "А как вообще это работает?" Т.е. вы рассказываете про двоичный код и тут же Питон. Все же в С можно понимать, как это все работает (после ВМКшного курса вплоть до ассемблера). Да, не стоит мне приводить ужасные допустимые конструкции в С, а так же все знание о преобразовании в асм умирает с волшебством оптимизатора, но все же.
Просто программируя на Питоне, я забываю про такие слова как мантисса, выделение памяти да и вообще память, двоичное представление числа и так далее. А насколько я помню, это так же входит в школьную программу. И С и Паскаль были приземленнее что ли.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 24, 2014 03:16 (UTC)
(Link)
Не надо бросаться словами "это также входит в школьную программу". В школьную программу ничего не входит. Даже программирование особо и не входит. Если тебя этому учили в школе, то это не означает, что и всех должны учить этому в школе.

И когда я учу детей на Питоне, то почему-то могу говорить и про двоичное представление чисел, и про битовые операции, и про дополнительный код, и про мантиссы и IEEE-754 - это всё даже в Python никто не отменял... Ну да, выделения памяти как такового там нет, этого уж не отнимешь.
[User Picture Icon]
From:justy_tylor
Date:Ноябрь, 24, 2014 03:29 (UTC)
(Link)
Да, Python намного лучше подходит для школьного обучения. Можно взять интерактивную среду IPython и начать с решения практических вычислительных задач из курсов физики/математики или реального мира. "Вот такая простая строчка на входе и вот такой красивый график на выходе". Продемонстрировать пользу. И далее переходить к автоматизации этих вычислений, также с демонстрацией пользы. Причём, на пиктомирах, скрэтчах или устаревшем Pascal этой пользы не показать, их применение ограничено "абстрактно-обучающим" контекстом.

Ещё один момент - "знание алгоритмов сортировки" бесполезно для любого непрограммиста. Как, впрочем, низкоуровневое программирование и многие другие вопросы. Эти знания некуда девать. Обычного среднего школьника полезно научить навыкам автоматизации предметной области. Применять алгоритмы. Чтобы мог написать скрипт "обработать много фоточек вот так". А уж как там ресэмплирование работает - будет разбираться, если захочет стать программистом. Сам, с помощью кружков или в вузе - по ситуации.
[User Picture Icon]
From:cross_join
Date:Ноябрь, 24, 2014 08:52 (UTC)
(Link)
Для непрограммистов существует офисный пакет, построить график или произвести расчеты в Excel/OO Calc - дело секунд. Скриптовый язык там тоже имеется.
Любой выход за пределы этой песочницы требует минимума профессиональных знаний.
[User Picture Icon]
From:denspb
Date:Ноябрь, 24, 2014 08:33 (UTC)
(Link)
В (Borland) Pascal QuckSort'а не было в стандартных библиотеках, но он был приведён в справке.
s/Python, то же Поляков/Python, тот же Поляков/
From:(Anonymous)
Date:Ноябрь, 24, 2014 13:07 (UTC)
(Link)
питон, наверное, хорош для изучения, и очень лаконичный язык, и довольно быстро можно начать какие-то практичные вещи делать, удобный инструментарий есть... Но, как минимум пример с инициализацией массива крайне неудачен: ========================= int m[10]; // <- вот это на порядок нагляднее, чем m = [0]*10 // если 'm[10]' очевидно, то и тут очевидно int m[20][10]; # а вот тут уже грабли, очевидные, но до осознания которых надо дорости m = [[0]*20]*10 ========================== есть очень некрасивые моменты, связанные с переходом v2 --> v3. например, чему будет равно c: a = 3 b = 2 c = a / b Ответ -- в зависимости от версии, в 2.x будет 1, в 3.x будет 1.5. Не знаю, что там духовный лидер принимал, когда v3 проектировал, но авторитет языка очень сильно все эти фокусы подорвали. Но, в целом, согласен, выбор хороший, и наверное лучше учить высокоуровневым вещам. В Питоне, например, совершенно шикарно списки сделаны, чего том же C и близко нет (а в C++/STL какой-то треш).
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 25, 2014 14:03 (UTC)
(Link)
Самый лучший способ избежать некрасивых моментов, связанных с переходом от второй версии к третей - никогда не использовать вторую версию. Собственно говоря, мы так и делаем в своей популяризации Питона - ориентируемся только на третью версию.
From:(Anonymous)
Date:Ноябрь, 24, 2014 16:01 (UTC)
(Link)
А можно тут отпишется ученик?
Ученик знал C++. До этой школы. И знает до сих пор.
Смотря на Python, ученик не понимал как это работает. А ученик привык понимать. И ученик полез в документацию и исходный код. Нарыл, к сожалению, немного.
У человека который знает что-нибудь низкоуровневое возникают вопросы:
1) А что хранится в памяти, по адресу списка? Объект? Или C-style массив, просто проблемы с памятью разруливаются на уровне языка? Иначе говоря, сколько памяти жрёт []? А [0]?
2) Строки во многом ведут себя как списки, только совершенно непонятно списки чего. Потому что типа char в Python нет. Кстати, сколько места занимает пустая строка?
3) Динамическая типизация, да? Интересно, код
for i in range(1000):
a = 0
a = '-'
выполнится медленнее чем код
for i in range(1000):
a += 1
a -= 2
Как работает смена типа?
4) Что такое на уровне памяти range- и xrange-объекты? Как реализован for i in range(), если после in должен стоять list, а попадается {x,}range object? Можно ли создать кастомный range object, например (1, 2, 3, 5, 7, 11, 13, 17...}?
И очень много вопросов, на которых ответа нет даже после гуглинга. Как можно рассчитывать насколько программа будет быстрой или сколько она будет отнимать памяти, если я не знаю что происходит? Как вообще можно пользоваться технологией, о которой неясно как она работает?
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 24, 2014 20:30 (UTC)
(Link)
А ученик может подойти ко мне и задать мне вопросы.

И да, я вижу слово "xrange". Python версии 2 я не обсуждаю. В Python версии 3 слова xrange нет.
[User Picture Icon]
From:piont
Date:Ноябрь, 24, 2014 16:35 (UTC)
(Link)
Наверное, это правильно написано, но есть маленькая поправка: на факультете компьютерных наук ВШЭ на первом курсе два языка -- и C++, и Python.
[User Picture Icon]
From:dkirienko
Date:Ноябрь, 24, 2014 20:27 (UTC)
(Link)
Ну мне выпускники сказали, что их сначала учили на Python, а потом - на C++. Поэтому верными могут быть оба утверждения - и что сначала Python, потом - C++, и что на первом курсе два языка - Python и C++.
[User Picture Icon]
From:2bytes
Date:Ноябрь, 24, 2014 23:53 (UTC)
(Link)
Спор про язык превращается в священную войну в вакууме, если не договорились, для чего, собственно, применяется обсуждаемое средство (а язык, это средство, да?). Примеры по арифметике решаются гораздо быстрее при помощи калькулятора, на алгебраических преобразованиях можно сэкономить при помощи какой-нибудь программы "математика" итп. Но цель-то, вроде, не в этом. Что, на наш взгляд, должно остаться в мозгах школьника N-го класса, прослушавшего курс программирования на языке X?

Совсем упрощая, возможны минимум две установки: "это навык, который пригодится в жизни" и "это упражнение, которое научит думать определенным образом" (что, тоже, hopefully, пригодится). Типичные "чистые" примеры это печатание 10-ю пальцами (которому учат в любой американской младшей школе) и, наоборот, геометрия (кто потом в жизни будет применять теорему косинусов? тем не менее...) Где на этой шкале обучение "программированию готовыми кусками"?

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

То, что это подготовка "массового программиста" - возможно, а точно их надо готовить? Я вот не готов обменять ни одного квалифицированного программиста своей команды на 10 "массовых", потому что после этого проект остановится.

Естественно, и на богатых языках можно давать (и выполнять) профессиональные задания (или близкие к таким), но тогда (1) сложность заданий получается примерно та же и (2) может остаться вопрос "где же тут внутри лошадь?". Конечно, бессмысленно программировать в машкодах, но показать какие-то вехи, как сложное иерархически строится из простого все же стоило б (электрон-атом-молекула-вещество-химическое свойство, булева схема-сумматор-процессор-код-компилятор-программа на языке высокого уровня). Им после школы еще про 100 языков расскажут (кому понадобится), а про это уже не расскажут никогда.


Edited at 2014-11-24 23:56 (UTC)
[User Picture Icon]
From:iscremas
Date:Ноябрь, 25, 2014 11:50 (UTC)
(Link)
Я бы согласился с Вашими доводами, но в в них есть вещи, которые я не разделяю:
Сейчас мы живем в такое время, что у каждого есть множество компьютерной техники в пользовании. И очень часто требуется выполнять какие-то рутинные и массовые вещи на этом железе. Например, копирование с переименованием по шаблону файлов, различная автоматизация процессов, для которой еще не сделали API и т.д. И для человека просто нужно уметь это писать быстро, чтобы не заниматься этим вручную по несколько часов в запущенных случаях. На мой взгляд - это минимальная задача курса программирования: научить излагать свои мысли и потребности на языке, понятном машине, и делать это по возможности с минимальными усилиями.

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

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

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

P.S. Периодически пользуюсь теоремой косинусов в своей жизни, это не шутка )
[User Picture Icon]
From:ignik
Date:Ноябрь, 25, 2014 01:40 (UTC)
(Link)
imho язык для школы дб живой, компактный, несложный.

Мой выбор - http://www.lua.ru/doc/

Особый бонус в поддержке в играх и gimp.
[User Picture Icon]
From:goldvitaly
Date:Ноябрь, 25, 2014 07:44 (UTC)
(Link)
Никогда не пробовал учить первому языку, но мне кажется очень хорошо использовать интерактивную среду. Мы на работе активно используем inotebook для экспериментов и демонстрации кода. Использование может помочь разделять код на логические куски.
[User Picture Icon]
From:sasha_tryu
Date:Декабрь, 11, 2014 08:09 (UTC)
(Link)
Я не согласен с автором - есть ещё более лёгкий в освоении язык программирования - Joy.

Прокомментирую несколько тезисов:

"легко начать программировать, ничего проще явно не существует"
Существует язык программирования Joy, в нём отсутствуют такие устаревшие понятия как оператор и разделение на строки. Программа пишется в виде текста, компилятор языка анализирует семантику текста, выделяет логические и циклические фрагменты и преобразует их в оптимизированный код.

"гораздо лаконичней Pascal и программирование на нём лишено необходимости возни с большим количеством технических вещей, что трудно для совсем начинающих".
В языке Joy даже системный программист абстрагирован от уровня железа. Компилятор, оптимизатор и абстрактор создают универсальный код, выполняющийся на любой современной платформе, совершенно независимо от любых технических характеристик. Есть сведения, что данный язык успешно внедряется в старые модели калькуляторов, такие как Электроника МК-56 (http://cdn.blindage.org/2013/05/2013-05-14-00.20_3.jpg) Пока ещё не решены все сложности адаптации библиотек трёхмерной графики, но специалисты обещают выход новой версии в ближайшее время.

"Гораздо проще писать программы начинающим, если они состоят из пяти строчек, а не из пятнадцати, алгоритмы они реализуют те же, а вот времени на написание и отладку кода уходит меньше, а, значит, и больше задач можно решить, и дальше продвинуться."
Как я уже писал, в языке программирования Joy отсутствуют строки, они просто не нужны. Программа пишется свободным текстовым стилем. По непроверенным данным в одной из школ пишут программы в стихах! Но и это не главное. Главное - в нём нет необходимости составлять какие бы то ни было алгоритмы! Уровень алгоритмизации полностью реализован специалистами в компиляторе и алгоритмизаторе. Разработчики вплотную приблизились к вариативному выполнению самой короткой программы на языке Joy - "Хочу!". В 11,5% случаев при запуске программа выполняет именно то, что хотел пользователь!

Упрощение-упрощение-упрощение... Если уж в 179 школе упрощают для "среднего ученика", что делать остальным школам? Что делать не московским школам? "Программировать" Word?
Извините за излишний сарказм, наболело...
[User Picture Icon]
From:sasha_tryu
Date:Декабрь, 11, 2014 08:10 (UTC)
(Link)
Мне видится, что дискутирующие на тему Питона не могут договориться потому, что у них разная база для аргументов - расхождение в стартовом посыле, "идеологии". Чему мы хотим научить ребят на уроках? Какие знания базовому уровню мы хотим дать?

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

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

Делая Питон первым языком программирования мы в некоторых случаях закладываем принцип "оно само делается" вместо чёткого понимания базиса компьютерных знаний. При этом, я не считаю, что Ассемблер будет лучше Паскаля или Си давать основы. Ассемблер - это другой уровень, естественное углубление и расширение знаний, которые уже получены и с которыми не возникает противоречия. С Питоном же в этом случае будут проблемы, нужно будет опровергать или сильно изменять предварительно полученные знания - считаю это существенным недостатком.

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

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

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

Отдельно хотелось упомянуть тезис "это ваши методические сложности". Считаю данный тезис формально правильным, но очень близоруким. Думая не только о себе, а также о среднем уровне педагогов в школах (немосковских!), можно вспомнить банальную заповедь программистов: если ваша программа может быть использована неправильно - она будет использована неправильно. Результат вряд ли обрадует. "Программист 1С" - широко известное имя нарицательное.

ПС
Дополнительно пара слов о высокоуровневых технологиях, которые стремительно расцвели к данному моменту и двигаются дальше. Считаю необходимым для развития кругозора давать и теоретически (на своём уровне) и практически (использовать и решать задачи!) : БД (SQL), OLE, HTML-Х, JavaSript, PHP, DirectX OpenGL. НО... при этом чётко проговаривая какая пропасть лежит между выделением байтиков и "функцией рендеринга вращения трёхмерного объекта в тумане" чтобы не нарушать структуру знаний.

Edited at 2014-12-11 08:12 (UTC)
[User Picture Icon]
From:wbgates
Date:Декабрь, 11, 2014 20:58 (UTC)
(Link)
Именно из-за таких людей, как вы, в России не развита система образования вообще. В РФ **еновое и школьное, и высшее образование. И всё из-за таких тупых людей, как вы. Консерватизм - ваше кредо по жизни. Так консервируйтесь и дальше. И не мешайте другим идти путём прогресса. По-моему, Pascal'ю уже давно пора идти на пенсию вместе с вами и Бейсиком-256. Вы тормоз российского образования.

Edited at 2014-12-11 20:59 (UTC)
(Оставить комментарий) Страница 1 из 2 - [1] [2]
Top of Page Разработано LiveJournal.com