Почему пайтон для начального обучения программированию — зло?

Почему пайтон для начального обучения программированию — зло?

Плохие времена рождают сильных программистов, и тогда наступают хорошие времена.
Но потом зачем-то создают Pyton, который рождает питонистов…

и тогда опять наступают тяжелые времена.

Очевидно, что пайтон является в настоящее время новомодным и очень популярным языком программирования. Он хорош для решения каких-то задач. Он подходит некоторым группам пользователей, кодерам (не программистам!), программистам-лентяям и т.п.

Однако, если вы вдруг учились программировать только на пайтоне и/или умеете на программировать только на нём, вы — не программист. Вы всего лишь «программист на пайтоне». Если изучив Pascal, C, BASIC или какой-то другой подобный «простой» и понятный язык программирования вы сможете без проблем перейти практически на любой другой язык программирования, в том числе и на пайтон, то для перехода на любой другой язык программирования с пайтона (если ваши знания им и ограничиваются) у вас возникнут серьёзные проблемы. Вам придется переучиваться практически с нуля. Возможно даже «снова» изучать основы программирования и теорию алгоритмов.

Да, во многих случаях кажется, что пайтон — это удобно. Но только «удобство» пайтона напоминает проекты Илона Маска: попса, в PR компанию которой вложено гораздо больше средств, чем в саму инженерную разработку. Что касается Маска, тут всё понятно, PR-менеджер не может руководить инженерными разработками (без инженера — никак). А вот пайтон создавался в первую очередь для упрощения решения задач: как калькулятор — для замены бумажки и карандаша. Но никак не для задач обучения программированию, тем более, на начальном этапе.

Что может пайтон? Пайтон может всё… что есть в его библиотеках. Но точно так же, это самое «всё» что есть в библиотеках — может вообще любой язык программированичя.

Но вот только у серьёзных языков программирования:
— возможности библиотеками не ограничиваются,
— библиотеки стандартизированы.
А библиотеки пайтона — носят все признаки кустарности. И для того, чтобы разобраться в новой библиотеке необходимо начинать изучать её практически с нуля: знания о тех библиотеках, что вы изучили ранее, вам никак не помогут.

Кстати, пайтон стоит сравнивать не с BASIC или Pascal (пайтон же позиционируется как язык «сверхвысокого уровня»!), а с С++ или C#, а это, кстати, — совсем не учебные языки программирования…

Проводя авиационную аналогию, точно так же не стоит сравнивать какой-нибудь F-22 и Cessna-172.

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

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

Нет, пайтон — отнюдь не плохой язык программирования. Пайтон — плохой учебный язык программирования.

Зачем в школе сначала учат считать палочки, изучают таблицу умножения, раз есть калькуляторы, компьютеры? Почему профессиональных водителей начинают учить ездить на машинах с ручной коробкой передач и без всяких ABS? Почему пилоты новейших самолетов Airbus и Boeing, под завязку набитых компьютерами и автоматикой, начинают учиться летать на простейшей Cessna-172, на самолете вообще без автоматики, с простым автопилотом и единственным триммером руля высоты? Зачем будущие капитаны и офицеры морского флота, которым предстоит управлять сложнейшими современными кораблями, где без компьютера порой даже дверь не открыть, проходят в процессе обучения практику на парусных кораблях образца XIX века?

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

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

В современном потребительском обществе считается, что специалисты обществу «не нужны». Считается, что для нужд общества «хватит и 10% инженеров», а все остальные 90% — будут только «кнопки нажимать». Но это неправда. И вот в чем незадача: «нажимание на кнопки» — мало того, что практически ничего не стоит (с точки зрения зарплаты), такого «нажимателя» очень легко, а главное, гораздо выгоднее заменить программой или простеньким роботом. И остается для таких недоучек — тяжелый ручной, порой неквалифицированный, труд: класть кирпичи, копать канавы, подметать улицы, собирать мусор, раскладывать продукты в супермаркетах, пасти скот, выращивать фрукты и овощи… — та работа, для которой действительно не нужно хорошее образование.

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

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

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

На самом начальном этапе (6-8 лет) русскоязычным детям удобнее всего использовать русский Scratch, которых хорошо подходит для понимания основ программирования и алгоритмов на самом начальном, игровом уровне. Затем разумнее всего переходить на RUbasic, простой, русский и очень функциональный язык программирования. Для плавного перехода к традиционным англоязычным языкам программирования после освоения RUbasic стоит перейти на MS Small Basic, а освоившись с английским синтаксисом, можно начинать программировать на С и на С++. При этом никто не запрещает реализовывать учебные алгоритмы параллельно еще на каких-нибудь языках программирования, таких как Pascal, Java, Python и т.п. Это существенно расширяет кругозор и помогает понять различия между языками программирования.

Почему же пайтон — мягко говоря «не самый подходящий кандидат» на звание учебного языка программирования особенно для начального уровня?

  • Для начала, учебный язык программирования должен быть легко читаемым для русскоязычных учащихся. Пайтон — таким не является: он полностью английский.
  • Затем, это язык должен быть легко понимаемым. В отношении пайтона это также неверно, потому что так называемая «магия пайтона» убивает всякую возможность простого понимания алгоритма, его работы.
  • Также, этот язык должен быть простым. Простым пайтон можно назвать только очень и очень условно.

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

Катастрофа современной системы образования в России заключается в частности в том, что в ней вообще нет учебного языка программирования. Даже о Microsoft Small Basic — учителя просто не знают и вынуждены пихать учащимся древний Pascal или BASIC, модный Python или Java, а на худой конец — С или С++. А ведь это равносильно начальному обучению пилотов не на симуляторах, а сразу на коммерческих рейсах, причём сразу — на Боингах или Аирбасах… Но ведь в авиации так никто не делает, прекрасно понимая всю глупость и несостоятельность такого подхода, почему же в обучении программированию детей здравым смыслом с лёгкостью пренебрегают?

Давайте рассмотрим какой-нибудь пример, как выглядит решение задачи на пайтоне. Например, транспонирование матрицы. Транспонирование матрицы — это операция над матрицей, при которой ее строки становятся столбцами, а столбцы — строками. Кто уже начинал изучать аналитическую геометрию или линейную алгебру, наверняка сталкивался с этой простейшей (для этого уровня) задачей. Иногда это задание даже дают на уроках информатики в качестве сложной задачи на обработку двумерных массивов, которые и называются матрицами.

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

Не уверен, что найдется хоть кто-нибудь, кто может серьезно считать, что разбор такого примера поможет учащемуся (тем более, на начальном уровне обучения) лучше понять алгоритм транспонирования матриц. Запутать — да. Поверить во что-то «непознаваемое», а следовательно, сверхъестественное — запросто. А ведь то же самое можно реализовать, например, на языке С или BASIC — просто и понятно, и, кстати, не намного длиннее.

Или вот вам еще пример на пайтоне:

for countdown in 5, 4, 3, 2, 1, "hey!":
print(countdown)

Всё понятно? Разумеется, я шучу. Ни один нормальный человек, не знакомый с пайтоном, не в состоянии понять, что делает этот код. Если вы знаете английский, то догадаетесь, что он что-то печатает. Как именно и почему — осталось «за скобками»… Вот она — «магия питона»! Уже чувствуете себя кроликом? А это — пример из самого начала одной из книг по начальному обучению пайтону, призванный показать его «простоту».

А вот еще «совсем простой и логичный» кусочек кода:

return 'flop' if arg == 'flip' else 'flip'

Что и в какой логической последовательности он делает? Да нет, «ну всё же просто и понятно»! Только вот кому?

А вот просто цитата из хорошего (действительно хорошего) учебника для начинающих «заклинателей змей»:
«Если переменная name примет одно из falsy-значений, переменной value будет присвоена пустая строка. В этом случае мы сможем работать с value уже как со строкой. Но здесь есть потенциальный баг: если name содержит falsy-значение, а переменной value можно присвоить значения типа 0, False, None, то этот код сработает неверно.»
Нет, вы это серьёзно? Это написано о языке программирования, который всем и везде пихается  как самый популярный и учебный? Нет, вы как хотите, а лично я после такого буду обходить этот язык 256-й дорогой…

Главная идея, упор на которую всегда делают адепты пайтона, состоит в том, что ваша программа делает очень многое с помощью всего нескольких строк кода. И это верно. Остается только понять эти «несколько строк кода». Разобраться, что и как она делает. А это на пайтоне — очень непросто. И большинство адептов сами не в состоянии до конца внятно объяснить работу своих программ, на примере которых они учат других программированию. Но если вернуться на землю, при обучении программированию — никогда не возникает задачи написания короткого кода. При обучении программированию ставятся совершенно другие задачи, и для их достижения необходим понятный, легко читаемый код.

А вот для чего код на пайтоне действительно очень хорош, так это — для… олимпиад по программированию. Более запутанных и неоднозначных фрагментов кода, чем написанных на пайтоне — трудно себе представить на любом другом языке программирования.

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

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

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

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

В противном случае итог будет печальный: мы получим людей, которые вроде бы «что-то знают», но при этом вообще не умеют программировать. Больше того, такие «знания» — напрочь убивают всякое желание развиваться дальше, в направлении программирования. Как говорил один из заслуженных преподавателей одной из ведущих школ Москвы в ответ на заявления родителей, что их дети «с лёгкостью программируют на пайтоне», — «Ошибаетесь. Ваши дети — с лёгкостью… воспроизводят те куски кода, которые их удалось заставить зазубрить за годы обучения, причем делают это безо всякого понимания»… Согласитесь, ужасающее заявление.

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

Если вы хотите научить учащихся думать как программисты, понимать как работают операционные системы, их собственные программы, начинать нужно с более простых языков программирования, таких как BASIC, Pascal, C, но только не с пайтона. Можно, конечно, начинать и с ассемблера, но это, к сожалению, тоже не способствует пониманию, по крайней мере, на начальных этапах. Изучение более простых (чем пайтон с его «магией») языков программирования даёт учащимся лучшее представление о том, как работает компьютер: его процессор, отдельные устройства, периферия, позволяет научиться понимать сообщения об ошибках программ и операционной системы и т.п.

Есть такой странный IT-парадокс: производительность вычислительных систем растёт почти в геометрической прогрессии, сложность большинства решаемых задач за последние 50 лет практически не изменилась, но при этом новые версии старых программ при решении тех же самых задач работают намного медленнее, чем их предшественники. В чем же дело?

Еще в 90-е годы прошлого века Билл Гейтс сказал, что если новые версии программ работают медленнее, то это проблема не программ, а железа. Согласитесь, для многих приложений это — полная чушь! Ведь с точки зрения решаемых задач в программах ничего не меняется. Меняется лишь интерфейс, украшения, различные финтифлюшки и т.п. На самом деле эта фраза была просто маркетинговым ходом, оправдывавшим раздувание программ и увеличение их неповоротливости.

Многие современные программы, имеющие многолетнюю историю сейчас представляют из себя эдакие «матрешки», в самой сердцевине которых — старый программный код, который в принципе работает очень быстро и занимает очень мало места. Однако, для того, чтобы запустить этот же самый код в современной графической оболочке (например, под Windows 10) необходимо обвесить его огромным количеством различных интерфейсных функций, обеспечивающих связь с операционной системой, что увеличивает объем кода и замедляет его выполнение в сотни раз.

Не погрешу против истины, говоря, что многие современные приложения можно уменьшить в 1000 раз (да-да, именно в 1000, а не в 10 и не в 100 раз!) по размеру и во столько же увеличить по производительности, если использовать действительно разумные средства разработки и прорабатывать каждый шаг алгоритма вашей программы собственной головой, не отдавая его на откуп «дефолтам», «магиям» и прочей ерунде, рассчитанной на лентяев.

Зачастую, люди, изучающие пайтон, автоматически (не задумываясь!) подключают в свой код кучу мощнейших библиотек ради реализации одной-двух элементарных функций, для решения которых достаточно 10 строк простейшего кода. Это сильно утяжеляет код и замедляет выполнение программы. А если вспомнить, что даже очень хорошо оптимизированный код на пайтоне примерно в 1000 раз медленнее аналогичного кода на C или C++, то представьте себе что в итоге получается. Вот на что расходуются те самые гигагерцы и гигабайты: не на решение самих задач, а на выполнение действий, с решением задач практически никак не связанных, либо на обработку не очень нужных украшений графического интерфейса.

В настоящее время прямым следствием высказывания Гейтса является следующее: раньше для того, чтобы обсчитать задачу запуска спутника в космос хватало 8-битного процессора с тактовой частотой не более 1 мегагерца, а сейчас у нас тормозит несколько вкладок, открытых в браузере при 6 -и ядерном 64-битном процессоре с тактовой частотой 3-4 гигагерца. Так может быть причина как раз в «пайтон-программистах», пишущих такие программы, а не в «слабом» железе?

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

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

Поделиться: 

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать rubasic.ru, вы соглашаетесь на использование файлов cookie.
Понятно