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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Поделиться: 

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