четверг, 4 января 2024 г.

Об использовании Питона в высшем образовании

There should be one—and preferably only one—obvious way to do it.

Тим Петерс о дзене, который питонисты так и не постигли (2004)

Python programmers are smart

Пол Грэм о питонистах, писавших в прошлом на других языках (2004)

Yoooooooooooooouuuuuuuniiiiiiicoooooooode

Гвидо ван Россум о пользе перехода с Python 2 на Python 3 (2005)



Наступил 2024. Питон — самый популярный язык в мире по рейтингу TIOBE. Самый известный программный продукт ушедшего года — ChatGPT — написан на Питоне. Питон легко выучить, и программисты на Питоне делают головокружительную карьеру в разработке. Питон — универсальный язык, на котором можно писать любые программы.

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

Между тем указанные факты никаких подобных следствий не имеют, для выбора Питона для написания программ нет оснований (за исключением узкой ниши машинного обучения), а изучение Питона может скорее навредить (в особенности в качестве первого языка программирования). Разберём популярные заблуждения в деталях.

Все нижеизложенные цифры — свежие (даны по состоянию на 2023) и вряд ли заметно изменятся в пользу Питона в будущем, т. к. язык существует более 32 лет, он старше своих нынешних конкурентов (кроме Bash, Tcl и C/C++) и свой потенциал взрывного роста давно исчерпал.

 

Рейтинги

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

В рейтингах, составленных на основании опросов пользователей Stackoverflow, Питон уступает JS (а среди профессионалов — и SQL). В целом ориентироваться на подобные рейтинги бесполезно, т. к. их показатели, во-первых, ничего не значат, а во-вторых, меняются чаще, чем образовательные учреждения могут менять свои учебные программы. (В вышеупомянутом TIOBE Питон лидировал в 2010, но опустился на 8-е место в 2013).

По количеству открытых репозиториев на Github Питон занимает второе место (после JS и перед Typescript). В исходных кодах пакетов современного дистрибутива Debian Bookworm Питон находится на 3-м месте по общему количеству строк кода (6.2%), после C и C++. Короче говоря, никаких признаков доминирования Питона в индустрии не обнаруживается.

 

Простота

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

Медлительность исполнения

Интерпретатор CPython (основная используемая реализация языка) — одна из самых медленных реализаций скриптового языка на свете. Программы на Питоне исполняются медленнее, чем аналогичные им на Си, в разы и десятки раз. В некоторой степени эта проблема может быть решена выводом интенсивных вычислений через ffi во внешние библиотеки, реализованные на Си (например, как сделано в numpy). Но такая схема работает лишь до тех пор, пока в вычислениях нет ветвлений. Ветвления, выраженные в коде на Питоне, не могут быть помещены в numpy. Показателен пример задачи поиска числа в отсортированном массиве. (Решение состоит из метода бисекций, содержащего ветвления.) В numpy метод бисекций реализован в функции searchsorted, которая по неизвестным причинам работает медленнее, чем функция bisect из стандартной библиотеки, оперирующая обычным питоновским списком, а не numpy-массивом. Также searchsorted работает медленнее, чем рукописный метод бисекций, оперирующий numpy-массивом; причины этого тоже неизвестны.

Несовместимости

Большая часть библиотек разрабатывается в отдельности от языка. При одновременном использовании нескольких библиотек возникают несовместимости между библиотеками, разрешимые в лучшем случае инсталлированием рекомендованных версий (для упрощения этого процесса в Питоне созданы виртуальные окружения, содержащие копии всех библиотек, нужных программе), а в худшем — правками со стороны пользователя после часов отладки и чтения форумов. Проблема усугубляется тем, что минималистичный синтаксис языка поощряет скрытое взаимодействие библиотеки с интерпретированной моделью пользовательской программы. Протоколов для такого рода взаимодействий не разработано, из-за чего и происходят наиболее сложные поломки. Примеры: pytorch и pyinstaller, numba и scipy. Проектам на C/C++/Java/C# и на многих других языках такие поломки не свойственны.

Отсутствие тредов на уровне ОС

Номинально треды в Питоне есть, но без параллельного выполнения байт-кода. Следовательно, параллельный режим доступен лишь для операций ввода-вывода и вызовов внешних библиотек (ffi). Все остальные операции выполняются последовательно на одном ядре CPU. Причиной этого является глобальная блокировка интерпретатора (GIL), созданная в CPython с первых дней его существования. Необходимости в GIL не было: например, в интерпретаторе Tcl она отсутствует. Тем более нет этой проблемы в языках без интерпретатора: C/C++/C#/Java/Go. Параллельное выполнение в Питоне можно получить в режиме мультипроцессинга, т. е. с помощью не тредов, а отдельных процессов. Такое решение приводит к увеличению расхода памяти (в каждом из процессов сидит целый независимый интерпретатор) и к необходимости обмена данными через разделяемую память (а не просто память процесса, как было бы при обычных тредах).

Разнообразие и изменчивость

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

Так, притчей во языцех является установка библиотек. Их можно ставить в системную инсталляцию Питона, или завести локальную инсталляцию Питона и ставить библиотеки в неё, или инсталлировать через PIP в локальную директорию site-packages, или через PIP в виртуальное окружение. Само виртуальное окружение можно сделать с помощью venv или virtualenv (это разные вещи с похожими названиями); также существуют pyenv, pyenv-virtualenv, virtualenvwrapper, pyenv-virtualenvwrapper и pipenv. Но и это ещё не всё: существует также conda и её вариации anaconda и miniconda. Рано или поздно разработчику приходится узнавать об этих средствах и о том, в каких отношениях они находятся между собой. Ни о какой простоте разработки (равно как и о самой разработке) при этом не идёт и речи.

Разнообразие проявляется и в интерфейсах библиотек, которые постоянно меняются. В сообществе питонистов не принято заботиться об обратной совместимости версий. Программа, которая не обновлялась 5 лет, скорее всего не будет работать со свежими версиями пакетов, от которых она зависела 5 лет назад. Она также может не заработать и с новыми версиями библиотек (после внесения нужных изменений в код, зависящий от них), потому что в библиотеках появились новые ошибки. (Стандарты тестирования питоновских библиотек бесконечно далеки от стандартов, применяемых например в SQLite, написанном между прочим на Си образца 1989 г.)

Принципы разработки библиотек вовсе не идут вразрез с принципами разработки самого Питона. В 2008 г. вышел Python 3, несовместимый с Python 2 на уровне не только библиотек, но и синтаксиса, что доставило проблем разработчикам в течение последующих 11 лет. Известна история компании Dropbox, которая начала миграцию с Python 2 на 3 в 2015 и закончила в 2018; руководил процессом лично создатель языка, Гвидо ван Россум, работавший в компании. Через год после миграции он ушёл на пенсию, а ещё через 2 месяца поддержка Питона 2 на python.org была официально прекращена.

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

В языках C, C++, Java, C# и многих других обратной совместимости уделяется огромное внимание. Аналогичных принципов придерживаются разработчики программ на этих языках. (Одним из наиболее ярых защитников обратной совместимости является Линус Торвальдс.) Новые возможности добавляются, но старые не удаляются. Если новые возможности несовместимы со старым API, заводится новая версия API, но старая продолжает поддерживаться. Ломать совместимость без веских причин нельзя.

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

 

Универсальность

На Питоне можно написать любую программу. На любом языке можно написать любую программу. Люди пишут тетрисы на sed, 3D-графику на Powershell и TLS на Javascript, а также занимаются машинным обучением на Форте. Всё это позволяет гордиться человечеством, но не имеет никакого отношения к практическим вопросам о том, какие языки нужно учить и на каких языках нужно писать.

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

А больше нигде Питона и нет. Знаете ли вы мобильные приложения на Питоне? Десктопные (кроме Dropbox, над которым, как сказано выше, работал создатель языка, и, кстати, там используется не совсем Питон, а его доморощенная модификация с JIT под названием Pyston)? Для микроконтроллеров? Операционные системы? Базы данных? Системы виртуальной реальности? Всё это бывает, но в маргинальных количествах.

Мобильные приложения пишутся на Java/Kotlin/Objective C/Swift/JS. Десктопные — на C++/C#/Java/JS. В микроконтроллерах, ОС и БД царит Cи. В системах виртуальной реальности — C#/C++/JS.

Но поговорим о питоновских нишах.

Скрипты

Скрипты бывают системные (для нужд ОС) или внутри больших приложений. Системные скрипты на Питоне хороши так же, как скрипты на Bash, Perl, BAT, Powershell и Tcl, т. е. никак. Питон вполне годится для системного скриптования, но по историческим причинам не занимает первое место в этой нише и вряд ли когда-либо займёт.

Скрипты в приложениях и видеоиграх? В Adobe преимущественно используется JS и его производные. В GIMP и Autocad — преимущественно Лисп. В Microsoft Office — преимущественно VBA. В World of Warcraft и Dota используется Lua. В Minecraft — JS. В играх Valve — Squirrel. Питон нередко встречается как опция (например, в Excel в 2023 появилась экспериментальная поддержка), но, как и в системных скриптах, никогда не станет лидером.

Веб-фреймворки

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

Тем не менее Питон используется лишь в 1.4% сайтов, а лидером серверной веб-разработки является PHP (76.7%). Питонисты смотрят на PHP свысока и считают его отсталым языком, но большая часть этих претензий относится к PHP 5-й версии (2004), тогда как в PHP 7 (2015) язык был подвергнут серьёзной переработке, а в 8-й версии получил вдобавок JIT-компилятор и стал полноценным современным языком. С обратной совместимостью ситуация в PHP не лучше, чем в Питоне, но всё же PHP 8 используют 17.5% сайтов — в 12 раз больше, чем Питон.

Среди популярных сайтов доля Питона выше, чем в среднем, но далека от доминирующей.

  • Google Search — в основном написан на C++, на Питоне только поисковый робот

  • Youtube — написан на Питоне, но собственно раздача видеоконтента является обязанностью специальной сети доставки контента (Media CDN); на каком языке она написана, не говорится, но вряд ли на Питоне.

  • Facebook — написан преимущественно на Hack, произошедшем от PHP.

  • Twitter — написан на Java, Scala, Ruby. Возможно есть и Питон, но в небольших количествах.

  • Википедия — написана на PHP

  • Reddit — на Питоне, отдельные части на Go

  • ВК — написан на KPHP, произошедшем от PHP

  • Поиск Яндекса — преимущественно на С++ и Java

Излишне упоминать, что серверные скрипты на Питоне не являются полноценными веб-серверами и обычно работают в связке с последними. Веб-серверы (Apache, nginx) написаны на Си.

Машинное обучение

Практически все нейросетевые модели разрабатываются на Питоне. Он действительно прекрасно для них подходит. Модели представляют собой последовательности однородных математических операций с массивами чисел, что позволяет автоматически вычислять необходимые в машинном обучении градиенты (см. дифференцируемое программирование). Недолговечность программ на Питоне в этом случае также не является проблемой, т. к. жизненный цикл моделей короток. Не является проблемой и быстродействие, т. к. ветвления и сложные структуры данных (самые слабые места языка с т. з. быстродействия) в нейросетевых моделях не используются, а математические алгоритмы, лежащие в основе питоновских библиотек для машинного обучения, реализованы на Си или CUDA. Так, в Pytorch менее половины кода написано на Питоне, в Tensorflow — менее трети.

Чтобы профессионально заниматься нейросетями, Питон знать недостаточно. Требуется знание линейной алгебры, матстатистики, нелинейной оптимизации и численных методов для всего этого. Питон — не первая дисциплина, которую придётся учить, и не первый язык программирования.

Кратко пройдёмся по биографиям нескольких знаменитых разработчиков в этой области. Андрей Карпатый писал на C++ и C, и до сих пор изредка пишет. Грег Брокман начинал карьеру с изучения теории языков программирования. Алексей Крижевский, Илья Суцкевер и Джеффри Хинтон, создавшие знаменитую нейросеть AlexNet, написали её на CUDA. Излишне добавлять, что все эти разработчики учились в хороших университетах США и Канады и стали тем, кем они стали, благодаря широте полученного ими образования и опыта, а не благодаря Питону, на котором они пишут сейчас.

Наука

Заблуждение о том, что Питон играет в науке какую-то значимую роль, имеет две причины:

  • Многие люди считают нейросети инструментом науки, хотя в действительности нейросети в научных исследованиях используются сравнительно редко, 8% в среднем и ещё меньше, если исключить информатику

  • Научные работники не склонны к написанию полноценных программ; им требуется инструмент, позволяющий с помощью минимального количества кода осуществлять операции с данными и визуализацию в интерактивном режиме. Исторически для этого применялись Matlab, Mathcad и Mathematica, но в 2015 г. появился Jupyter Notebook и немедленно завоевал популярность. Произошёл переход от очень плохих средств программирования к просто плохим (к тому же Jupyter, в отличие от своих конкурентов, бесплатен).

В остальном (кроме машинного обучения и Jupyter) использование Питона в науке минимально, в основном для биндингов к библиотекам на C/C++, одноразовых скриптов, о которых их авторы забывают через неделю, или студенческих поделок, созданных для дипломной работы, которые потом продолжают другие студенты того же руководителя. Более распространённые в науке языки — вышеупомянутые C/C++, а также Фортран; специально для научных вычислений был разработан язык Julia.

Автор все графики в своих статьях делал на gnuplot и может заверить, что обработку и визуализацию несложных данных можно делать на gnuplot + awk быстрее, чем у питонистов запустится PyCharm.

Никаких уникальных качеств, востребованных в науке, Питон не имеет. Программу для научного исследования можно написать хоть на Bash (пример: статья в Nature). Целью любого исследования является интерпретация данных, помещение результатов в научный контекст, извлечение смысла. Язык программирования на этом фоне второстепенен.

 

Образование

В 2008 г. в Массачусетском технологическом институте был прекращён знаменитый курс 6.001 «Структура и интерпретация компьютерных программ», основанный на Лиспе. Один из авторов курса — профессор Джеральд Сассман — по собственному желанию перешёл с преподавания Лиспа на преподавание Питона. При этом ему и его коллегам Питон не нравился, что он объяснил тем, что все они, включая его самого, — «old farts». На первый взгляд это может показаться заменой менее популярного языка на более популярный, т. е. уступкой моде, но в действительности дело обстояло более печальным образом. Джеральд Сассман не просто перестал преподавать Лисп, а перестал преподавать программирование в том виде, в котором преподавал его 28 лет. Он решил, что профессия программиста, который создаёт программы с нуля, более не востребована, и сменил курс 6.001 на 6.01 (программирование роботов на Питоне с помощью готовых библиотек).

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

В Питоне принята низкая культура программирования (если не считать культурой любование краткостью синтаксиса, даже если этим синтаксисом написана программа, работающая квадратичное время вместо линейного). Питон держит начинающего программиста в неведении относительно истинной модели выполнения программ (на CPU или на GPU). Синтаксис Питона поощряет использование неэффективных структур данных. Программисты на Питоне часто пишут программы для себя, а не для других. (Более того, в последние годы чаще пишут Jupyter-блокноты, чем программы.) Питонисты считают, что уже выучили окончательный язык программирования, и это самое страшное: если Питон является первым из изучаемых языков, то он становится и единственным. Профессиональные знания не удерживаются в голове студента, профессиональные навыки не формируются.

 

Карьера

Зарплаты разработчиков на Питоне не имеют заметного отрыва от зарплат разработчиков на других языках. Например, начинающие на Питоне получают немного меньше, чем такие же на C++/C#/Java, и немного больше, чем такие же на JS и PHP (данные Хабр.Карьеры). По количеству вакансий Питон занимает 2-е место (20%) после JS (30%), третье место у Java (18%, данные DevJobsScanner). Но всё это не имеет большого значения. Для каждого индивида существенная разница в зарплате достигается не при переходе на другой язык, а при повышении уровня квалификации (что и видно по кратным разницам в зарплатах между начинающими, средними и старшими разработчиками). Нет причины учить именно Питон или начинать именно с Питона; нужно учиться хорошо писать программы.

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

 

Что же учить вместо Питона?

Если вы прочли текст от начала до конца и задаётесь этим вопросом, ответ такой: в первую очередь нужно учить Microsoft PowerPoint. Да, да, да.

Пользователей PowerPoint в мире не менее полумиллиарда. Powerpoint используется практически во всех отраслях науки и техники (и даже искусства). Презентации в Powerpoint показывают все люди — от школьников до миллиардеров, от микробиологов до астрофизиков, от стажёров до директоров. Это инструмент, поистине объединивший человечество (за исключением вооружённых сил США, в которых запретили презентации в 2010-х годах). Учите Powerpoint, остальное приложится. Успех ждёт вас.